Я полагаю, что этот вопрос касается жизни в целом, но у меня возникают трудности с закрытием, потому что вы не можете записать их тип.Как объявить замыкание, которое живет дольше, чем его охватывающий блок
Этот пример немного надуманный - я только начинаю изучать Ржавчину, и это то, что меня повесили.
Эта программа не скомпилируется:
fn main() {
let mut list: Vec<&Fn() -> i32> = Vec::new();
{
list.push(&|| 1);
}
}
Потому что:
src/main.rs:5:25: 5:24 error: borrowed value does not live long enough
src/main.rs:5 list.push(&|| 1);
^~~~
src/main.rs:2:50: 7:2 note: reference must be valid for the block suffix following statement 0 at 2:49...
src/main.rs:2 let mut list: Vec<&Fn() -> i32> = Vec::new();
src/main.rs:3
src/main.rs:4 {
src/main.rs:5 list.push(&move || 1);
src/main.rs:6 }
src/main.rs:7 }
src/main.rs:5:9: 5:26 note: ...but borrowed value is only valid for the statement at 5:8
src/main.rs:5 list.push(&|| 1);
^~~~~~~~~~~~~~~~~
src/main.rs:5:9: 5:26 help: consider using a `let` binding to increase its lifetime
src/main.rs:5 list.push(&|| 1);
^~~~~~~~~~~~~~~~~
То, что я понял из этой ошибки в том, что срок службы закупоривающего ограничивается заявление внутри блока, но должен жить для всего тела main
.
Я знаю (или, я думаю), что передача закрытия в push
в качестве ссылочного означает, что push
заимствует только закрытие, и это право собственности будет возвращено блоку. Этот код будет работать, если я могу просто дать закрытие push
(т. Е. Если push
взял на себя ответственность за закрытие), но поскольку закрытие не имеет размера, я должен передать его как ссылку.
Это правильно? Как я могу заставить этот код работать?