rust - 删除临时值如何在 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
解决方案
推荐阅读
- constants - 如何在 puppeteer Node.js 中将 const 添加到 await page.$eval?
- python - 对frozensets列表进行排序?
- c# - FluentValidation 比较来自不同类的 2 个值
- javascript - 为什么这个返回的 promise 的值没有更新?
- vba - 在字符串文本 Access 中插入超链接
- ios - Xamarin.Forms iOS 15 导致应用程序冻结/崩溃
- css - TailwindCSS 中类似 Webflow 的布局
- flutter - 如何以高性能的方式处理抖动的图像像素?
- mysql - MySQL 数据库 discord.js
- wordpress - Google Analytics(分析)数据仅显示在 MonsterInsights 上