相关疑难解决方法(0)

当不可变引用可以完成这项工作时,为什么我们需要 Rc<T>?

为了说明 的必要性Rc<T>本书提供了以下代码片段(剧透:它不会编译)来表明,如果没有Rc<T>.

\n
enum List {\n    Cons(i32, Box<List>),\n    Nil,\n}\n\nuse crate::List::{Cons, Nil};\n\nfn main() {\n    let a = Cons(5, Box::new(Cons(10, Box::new(Nil))));\n    let b = Cons(3, Box::new(a));\n    let c = Cons(4, Box::new(a));\n}\n
Run Code Online (Sandbox Code Playgroud)\n

然后它声称(强调我的)

\n
\n

我们可以更改 的定义来Cons保存引用,但随后我们必须指定生命周期参数。通过指定生命周期参数,我们将指定列表中的每个元素的生存时间至少与整个列表一样长。例如,借用检查器不会让我们进行编译,因为在 a 可以引用它之前,临时值将被删除。let a = Cons(10, &Nil);Nil

\n
\n

嗯,不完全是。以下代码片段在下编译rustc 1.52.1

\n
enum List<\'a> {\n    Cons(i32, &\'a List<\'a>),\n    Nil,\n}\n\nuse crate::List::{Cons, Nil};\n\nfn main() {\n    let a = Cons(5, &Cons(10, &Nil));\n    let b = Cons(3, …
Run Code Online (Sandbox Code Playgroud)

reference immutability ownership rust borrow-checker

10
推荐指数
1
解决办法
1218
查看次数