Рассмотрим следующую (неполную) сигнатуру функции:
unsafe fn foo<'a, T: 'a>(func: impl FnOnce() -> T + 'a) -> ...
Есть ли способ (небезопасно, конечно) transmute
функцию ввода, чтобы она стала impl FnOnce() -> S + 'static
, где S того же типа, что и T, но с S: 'static
.
Я знаю, что можно преобразовать границы времени жизни самого замыкания, используя упакованную черту (FnBox
), а затем вызывая преобразование в коробке. Однако это не влияет на тип возвращаемого значения (T
). Насколько я понимаю, T: 'a
и T: 'static
- это разные типы в соответствии с системой типов. Так что мне интересно, можно ли вообще выразить это в Rust.
Я полагаю, что подпись должна выглядеть так (игнорируя ограничения времени жизни самого закрытия):
unsafe fn<'a, T, S>(func: impl FnOnce() -> T) -> impl FnOnce() -> S
where
T: 'a,
S: 'static`
но тогда как вы вызываете эту функцию без указания, что T
и S
идентичны, за исключением их срока службы.
Заявление об ограничении ответственности. Я знаю, что возиться с ограничениями времени жизни, как правило, не рекомендуется, однако это касается создания потоков, в которых ограничения времени жизни применяются другими способами.
unsafe fn foo<'a, T>(func: impl FnOnce() -> T + 'a) -> impl FnOnce() -> T + 'static
. - person Peter Hall   schedule 20.09.2018impl
в аргументе определяется вызывающим, аimpl
в позиции возврата определяется функцией. Но каким-то образом они должны быть одинаковыми? Я не думаю, что ты сможешь это сделать. - person Peter Hall   schedule 20.09.2018