暂时值的下降如何在锈中起作用?

时间:2018-09-16 15:14:18

标签: rust borrow-checker

简介

我尝试从a chapter of the Rust book about Rc验证此语句:

  

我们可以将Cons的定义改为保留引用,但是随后我们必须指定生命周期参数。通过指定生命周期参数,我们将指定列表中的每个元素的寿命至少与整个列表一样长。借位检查器不会让我们编译let a = Cons(10,&Nil);例如,因为临时的Nil值会在a引用它之前被删除。

声明的验证

我尝试实现并打印enum List。借阅检查器允许我编译并执行它。虽然这本书描述了相反的行为。

#[derive(Debug)]
enum List<'a> {
    Cons(i32, &'a List<'a>),
    Nil,
}

use List::{Cons, Nil};

fn main() {
    let a = Cons(5, &Cons(10, &Nil));
    println!("{:?}", a);
}

然后,我分别定义了Nil值。这次,借阅检查器就像书中描述的那样工作。

fn main() {
    let n = Nil;
    let a = Cons(5, &Cons(10, &n));
    println!("{:?}", a);
}

结果:

11 |     let a = Cons(5, &Cons(10, &n));
   |                      ^^^^^^^^^^^^ - temporary value dropped here while still borrowed
   |                      |
   |                      temporary value does not live long enough

问题

1)为什么借位检查器允许编译Cons(5, &Cons(10, &Nil))?这本书有误吗?

2)为什么借位检查器允许编译Cons(5, &Cons(10, &Nil));而不是Cons(5, &Cons(10, &n));

3)为什么在下一个&Cons(10, &n)引用临时Cons之前,而不是在执行过程超出范围之后才删除临时Get(在我的情况下,此范围是主要的功能)?

0 个答案:

没有答案