Ray*_*oal 5 arrays closures lifetime rust
编者注:这个问题在Rust 1.0之前被问过,并且从那时起一些语法发生了变化,但基本概念仍然存在.一些答案已针对Rust 1.0语法进行了更新.
我是Rust的新手,并尝试使用在JavaScript,Python等方面无关紧要的闭包,但我遇到Rust的终身问题.我理解错误信息,但它让我相信我想要做的事情在Rust中非常难.
我只是想创建一个函数数组a
,这样
a[0]
是返回0的函数a[1]
是返回1的函数a[9]
是函数返回9我试过了:
fn main() {
let a : [||->uint, ..10];
for i in range(0u, 10) {
a[i] = ||{i};
}
println!("{} {} {}", a[1](), a[5](), a[9]())
}
Run Code Online (Sandbox Code Playgroud)
但我得到了一生的错误.a
由于生命周期不能超过while
块,所以报告的错误是"无法推断由于要求冲突的适当生命周期",因此闭包不能超过它们的堆栈帧,这当然是因为我正在调用它们println!
.
我敢肯定必须有一种方法来构建这个函数数组,但是如何?
你需要使用move || i
.
move
暗示这种关闭将i
取值而不是通过引用.默认情况下,这些闭包只会引用i
.在你的情况下,它被禁止,因为生命周期i
仅限于循环体.
另外,Rust会抱怨你的阵列可能没有完全初始化.要避免它,您可以使用Vec<_>
,或使用std::mem::uninitialized
:
fn main() {
let mut a: [_; 10] = unsafe { std::mem::uninitialized() };
for i in 0..10 {
a[i] = move || i;
}
println!("{} {} {}", a[1](), a[5](), a[9]())
}
Run Code Online (Sandbox Code Playgroud)