为了说明必要性Rc<T>
, the Book https://doc.rust-lang.org/book/ch15-04-rc.html呈现以下代码片段(剧透:它不会编译)以表明我们无法在没有Rc<T>
.
enum List {
Cons(i32, Box<List>),
Nil,
}
use crate::List::{Cons, Nil};
fn main() {
let a = Cons(5, Box::new(Cons(10, Box::new(Nil))));
let b = Cons(3, Box::new(a));
let c = Cons(4, Box::new(a));
}
然后它声称(强调我的)
我们可以改变的定义Cons
来保存引用,但是我们必须指定生命周期参数。通过指定生命周期参数,我们将指定列表中的每个元素的生存时间至少与整个列表一样长。借用检查器不允许我们编译let a = Cons(10, &Nil);
例如,因为临时Nil
在 a 引用它之前, value 将被删除。
嗯,不完全是。以下代码片段在下编译rustc 1.52.1
enum List<'a> {
Cons(i32, &'a List<'a>),
Nil,
}
use crate::List::{Cons, Nil};
fn main() {
let a = Cons(5, &Cons(10, &Nil));
let b = Cons(3, &a);
let c = Cons(4, &a);
}
请注意,通过引用,我们不再需要Box<T>
间接保存嵌套List
。此外,我可以指出b
and c
to a
, 这使a
多个概念所有者(实际上是借款人)。
问题:为什么我们需要Rc<T>
不可变引用什么时候可以完成这项工作?