我尝试从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
(在我的情况下,此范围是主要的功能)?