在这种情况下借来的价值不够长(Vec<& Fn(i32) - > i32>)

时间:2016-04-03 23:02:05

标签: rust

我有这个错误,有时我有类似的东西,我已经能够以不同的方式解决,但现在不是如何在这种情况下解决:

  

借来的价值不够长。

我移动了一个更简单的代码,但我找不到错误:

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);

play.rust

1 个答案:

答案 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
}

Rust Playground

但是,如果你只使用静态函数 - 而不是闭包 - 以下也可以正常工作,并且让你避免额外的让:

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

第三个选项是使用盒装闭包,让你可以使用闭包和静态函数,而不需要额外的让,但有自己的权衡:

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 Playground