错误:借来的值只是...引用必须有效

时间:2016-04-02 21:25:29

标签: rust

我在编译下面的代码时遇到这些错误(代码1)

  

错误:v的寿命不够vec.push(& v);

     

注意:引用必须对以下语句的块后缀有效   0时15分64秒......

     

注意:...但借来的值仅对块后缀有效   以下陈述2于19:35

(代码1)

fn main() {

    let mut vec: Vec<&Inf> = Vec::<&Inf>::new();//<-- It appears the error

    let p: Foo1  = Foo1::created(); 
    let v: Foo2  = Foo2::created();

    vec.push(&v);
    vec.push(&p);

但不是在vec移动pv之后。

(代码2)

fn main() {

    let p: Foo1  = Foo1::created(); 
    let v: Foo2  = Foo2::created();

    //It does not appear the error described above
    let mut vec: Vec<&Inf> = Vec::<&Inf>::new(); //<-- It does not appear the error
    vec.push(&v);
    vec.push(&p);

..//

(这种行为可能是正常的,如果有人可以解释我的话。)

这是我创建的类似案例,因此您可以看到错误

错误 play.rust

无错误 play.rust

我读到了这个ownershipborrowing

1 个答案:

答案 0 :(得分:5)

是的,这种行为绝对正常且自然。

这是一个更简单的例子:

{
    let x = 1;
    let mut v = Vec::new();

    v.push(&x);
}

此代码编译,但不会:

{
    let mut v = Vec::new();
    let x = 1;

    v.push(&x);
}

这是因为变量破坏的顺序与其构造顺序相反。在上面的示例中,它是这样的:

x created
v created
v[0] = &x
v destroyed
x destroyed

但在最底层我们有这个:

v created
x created
v[0] = &x
x destroyed  // x is destroyed, but v still holds a reference to x!
v destroyed

也就是说,在底部示例中,当有一个已经被销毁的x的未完成引用时,有一个时刻(尽管接近于不可见)。