你在这里做的是创建一个闭包的Vec。在Rust中,静态函数与闭包略有不同,因此当我们创建引用时,实际上会创建一个闭包。如果我们在创建Vec之后再创建引用,则生成的闭包的寿命比Vec短,这是错误的。相反,我们可以使用let在创建Vec之前创建闭包,从而给出足够长的寿命,使其超出Vec的生命周期。
fn main() {
let extended = &ops_code1;
let mut v: Vec<&Fn(i32) -> i32> = Vec::new();
v.push(extended);
}
fn ops_code1(value: i32) -> i32 {
println!("ops_code1 {}", value);
value
}
Rust Playground
然而,如果您只使用静态函数-而不是闭包-则以下内容也可以正常工作,并且让您避免额外的let:
fn main() {
let mut v: Vec<fn(i32) -> i32> = Vec::new();
v.push(ops_code1);
v.push(ops_code2);
}
fn ops_code1(value: i32) -> i32 {
println!("ops_code1 {}", value);
value
}
fn ops_code2(value: i32) -> i32 {
println!("ops_code2 {}", value);
value
}
Rust Playground
第三个选项是使用boxed closures,它让你可以同时使用闭包和静态函数,而不需要额外的let语句,但是也有其自己的权衡。
fn main() {
let mut v: Vec<Box<Fn(i32) -> i32>> = Vec::new();
v.push(Box::new(ops_code1));
v.push(Box::new(ops_code2));
for f in v {
f(1);
}
}
fn ops_code1(value: i32) -> i32 {
println!("ops_code1 {}", value);
value
}
fn ops_code2(value: i32) -> i32 {
println!("ops_code2 {}", value);
value
}
Rust 操场