首页 > 解决方案 > 删除临时值如何在 rust 中起作用?

问题描述

介绍

我试图从Rust 书中关于 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)为什么在 next可以引用它之前,而不是在执行过程超出范围(在我的情况下,这个范围是主要功能)之后,临时&Cons(10, &n)会被删除?Cons

标签: rustborrow-checker

解决方案


推荐阅读