【发布时间】:2021-08-17 05:17:39
【问题描述】:
为了说明Rc<T> 的必要性,the Book 提供了以下 sn-p(剧透:它不会编译)以表明如果没有 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 可以引用它之前被删除。
嗯,不完全是。以下sn -p 在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 和c 都指向a,这给a 提供了多个概念所有者(实际上是借款人)。
问题:当不可变引用可以完成这项工作时,为什么我们需要Rc<T>?
【问题讨论】:
-
您当然可以这样做,但由于
List仅借它的值,您将难以从例如函数返回填充的List。 -
@kmdreko 这是有道理的。现在让我试试看我能不能有类似
Cons(i32, &'a Box<List<'a>>),...
标签: rust reference immutability borrow-checker ownership