在此代码中:

fn main() {
    let a = {
        &mut vec![1]
    };
    let b = {
        let temp = &mut vec![1];
        temp
    };
    println!("{a:?} {b:?}");
}

为什么a是有效的,b是无效的("temporary value dropped while borrowed [E0716]")?

对我来说,如果他们都是有问题的,为什么不取消a人中的VEC?

这仅仅是因为编译器可以理解第一个示例,而第二个示例太难理解了吗?

推荐答案

一句话:a是暂时的,b不是.

temp是一个变量;variables are always dropped at the end of the enclosing scope.在我们将其分配给b之前,作用域结束.

相比之下,a中的vec![]是临时的,因为它没有被赋值给变量.Temporaries are generally dropped at the end of the statement,但是,因为该语句是一个let声明,所以它内部的临时语句受temporary lifetime extension的约束,其生存期被延长以匹配a本身的生存期,也就是说,直到封闭的块of 103.

请注意,准确地说,temp还分配了一个受临时生命周期延长的临时变量,但其延长的生命周期与生命周期of 100匹配,因为它是其声明的一部分.

Rust相关问答推荐

在rust中如何修改一个盒装函数并将其赋回?

如何使用Match比较 struct 中的值

这个规则关于或模式到底是什么意思?如果表达片段的类型与p_i|q_i...&q;不一致,就会形成

在自定义序列化程序中复制serde(With)的行为

像这样的铁 rust 图案除了‘选项’之外,还有其他 Select 吗?

使用极点数据帧时,找不到枚举结果的方法lazy()

铁 rust 中的泛型:不能将`<;T作为添加>;::Output`除以`{Float}`

如果包名称与bin名称相同,并且main.ars位于工作区的同一 crate 中,则无法添加对lib.ars的依赖

如何从ruust中的fig.toml中读取?

循环访问枚举中的不同集合

为什么实现特征的对象期望比具体对象有更长的生命周期?

‘&T as *const T as *mut T’ 在 ‘static mut’ 项目中合适吗?

Rust 打包在 .deb 中

如何判断服务器是否正确接收数据

如何将 Rust 中的树状 struct 展平为 Vec<&mut ...>?

是否有适当的方法在参考 1D 中转换 2D 数组

意外的正则表达式模式匹配

TcpStream::connect - 匹配武器具有不兼容的类型

制作嵌套迭代器的迭代器

Rust 内联 asm 中的向量寄存器:不能将 `Simd` 类型的值用于内联汇编