Rust 在这种情况下,借入价值的有效期不够长(Vec<;<;Fn(i32)>;i32>;)

Rust 在这种情况下,借入价值的有效期不够长(Vec<;<;Fn(i32)>;i32>;),rust,Rust,我有这个错误,其他时候我也有类似的问题,我能够以不同的方式解决,但现在不是在这种情况下如何解决: 借来的价值在经济中的寿命不够长 我将失败的代码移到了一个更简单的位置,但我找不到错误: fn main(){ let mut v: Vec<&Fn(i32) -> i32> = Vec::new(); v.push(&ops_code1); //v.push(&ops_code2); //v.push(&ops_c

我有这个错误,其他时候我也有类似的问题,我能够以不同的方式解决,但现在不是在这种情况下如何解决:

借来的价值在经济中的寿命不够长

我将失败的代码移到了一个更简单的位置,但我找不到错误:

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 {
..//
fn main(){
让mut v:Vec i32>=Vec::new();
v、 推送(和操作代码1);
//v、 推送和操作代码2);
//v、 推送(和操作代码3);
}
fn操作代码1(值:i32)->i32{
..//
错误:借用值的有效期不够长

v、 推送(和操作代码1)


您在这里所做的是创建一个由闭包组成的Vec。在Rust中,静态函数的处理方式与闭包略有不同,因此当我们创建引用时,实际上会创建一个闭包。如果我们在创建Vec后这样做,则生成的闭包的生存期比Vec短,这是一个错误。我们可以改为使用let-to-crea在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(){
设扩展=&ops_code1;
让mut v:Vec i32>=Vec::new();
//请注意,将其放置在此处不起作用:
//设扩展=&ops_code1;
v、 推(扩展);
//v、 推送和操作代码2);
//v、 推送(和操作代码3);
}
fn操作代码1(值:i32)->i32{
println!(“操作码1{}”,值);
价值
}

但是,如果您只使用静态函数,而不使用闭包,那么以下功能也可以正常工作,并且可以避免额外的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
}
fn main(){
让mut v:Vec i32>=Vec::new();
v、 推送(操作代码1);
v、 推送(操作代码2);
}
fn操作代码1(值:i32)->i32{
println!(“操作码1{}”,值);
价值
}
fn操作代码2(值:i32)->i32{
println!(“操作码2{}”,值);
价值
}

第三种选择是使用盒式闭包,它允许您在不使用额外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
}
fn main(){
让mut v:Vec>=Vec::new();
v、 推送(盒子:新的(操作代码1));
v、 推送(盒子:新的(操作代码2));
对于f/v{
f(1);
}
}
fn操作代码1(值:i32)->i32{
println!(“操作码1{}”,值);
价值
}
fn操作代码2(值:i32)->i32{
println!(“操作码2{}”,值);
价值
}

您能在中共享整个文件吗?@cengiscan确实看起来UpdateAnks很有用,但我有一个问题,我必须创建尽可能多的函数,let extended=&opu codeX;,如果不创建let,没有其他方法可以做到这一点。编辑:我是新手,但我认为您的更新是我使用的,谢谢您的时间let是给essen的tially使用一个静态函数作为闭包。因此每个静态函数需要一次(对于第一个备选方案)。对该主题进行了更多阅读,我将扩展我的答案以进一步解释。感谢详细信息,但我不能再投票了。当然,没问题。只是想随着我对问题的进一步理解,改进我的答案。:)