我有这个错误,有时我有类似的东西,我已经能够以不同的方式解决,但现在不是如何在这种情况下解决:
借来的价值不够长。
我移动了一个更简单的代码,但我找不到错误:
fn main(){
let mut v: Vec<&Fn(i32) -> i32> = Vec::new();
v.push(&ops_code1);
//v.push(&ops_code2);
//v.push(&ops_code3);
}
fn ops_code1(value: i32) -> i32 {
..//
错误:借来的价值不够长
v.push(安培; ops_code1);
答案 0 :(得分:3)
你在这里做的是创造一个封闭的Vec。在Rust中,静态函数与闭包的处理方式略有不同,因此当我们创建引用时,实际上会创建一个闭包。如果我们在创建Vec之后这样做,结果闭包的生命周期比Vec短,这是一个错误。我们可以使用let在 Vec之前创建闭包,给予足够长的寿命,比Vec更长寿命:
fn main() {
let extended = &ops_code1;
let mut v: Vec<&Fn(i32) -> i32> = Vec::new();
// Note that placing it here does not work:
// let extended = &ops_code1;
v.push(extended);
//v.push(&ops_code2);
//v.push(&ops_code3);
}
fn ops_code1(value: i32) -> i32 {
println!("ops_code1 {}", value);
value
}
但是,如果你只使用静态函数 - 而不是闭包 - 以下也可以正常工作,并且让你避免额外的让:
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
}
第三个选项是使用盒装闭包,让你可以使用闭包和静态函数,而不需要额外的让,但有自己的权衡:
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
}