函数的生命周期在函数指针赋值和初始化中表现不同

时间:2015-12-18 07:13:50

标签: functional-programming rust

见下面的例子

rustc 1.5.0 (3d7cd77e4 2015-12-04)

这可以编译。 如果我评论案例1并取消注释案例2.我收到了错误

E_STRICT

为什么呢?这是一个错误吗? 我正在使用rustc 1.5.0

phpinfo()

2 个答案:

答案 0 :(得分:4)

我认为这不是一个错误。请注意,它也会在没有函数指针的情况下产生相同的错误。

// this compiles
let a: &i32 = &3;

vs

let a: &i32;
a = &3;
   //^ error: borrowed value does not live long enough

上面的两段代码不相同。生命周期从绑定变量(let a: &32)的位置开始,而不是在您为其指定的位置(a = &3)。如果您将两者分开,就像在第二种情况下一样,您说& i32的生命周期应该从let a: &i32行开始,编译器无法在此保证一般情况。

例如,假如你做了:

// does not compile
let a: &i32;
{
    let b = 3;
    a = &b;
} // b is out of scope, so a can't still contain a live reference here

你可以使这个工作,但你明确需要告诉编译器b是静态的(静态生命周期比所有东西都要长),如下所示:

   let a: &i32;
   static b: i32 = 3;
   a = &b;

或(在您原来的情况下):

let myFunctor: &Fn(i32) -> i32;
static F: fn(i32) -> i32 = fx;

myFunctor= &F;

答案 1 :(得分:1)

是否可以与const vs static相关联?

static i:usize = 0usize;

fn test_Functor()
{
    // case 2. Assignment
    let myFunctor: &usize;
    myFunctor= &i ;

}

它在istatic时进行编译,但在const时进行编译。 从book开始,据说静态不是内联的......