为了说明
注意,通过获取引用,我们不再需要
问题:当不可变引用能够完成任务时,为什么还需要
Rc<T>
的必要性,该书 提供了以下片段(提示:它不会编译)来展示未使用 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 取得对它的引用之前被丢弃。
嗯,不完全是这样的。以下代码片段在 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
会有麻烦。 - kmdrekoCons(i32, &'a Box<List<'a>>)
... - nalzok