我想這個問題是關於總體生命期的,但是由於你不能寫出它們的類型,所以我在封閉時遇到了困難。如何聲明一個封閉的壽命比封閉塊更長
這個例子有點做作 - 我剛開始學習Rust,這是我一直在掛的。
該程序不會編譯:
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
取得了閉包的所有權),則此代碼可行,但由於閉包的大小不合適,我必須將其作爲參考傳遞給它。
是嗎?我怎樣才能使這個代碼工作?