rust 为什么给变量赋值一个引用会使我不能返回它

nsc4cvqm  于 2023-02-04  发布在  其他
关注(0)|答案(1)|浏览(157)

在此代码中:

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

为什么a有效而b无效("借用时临时值丢失[E0716]")?
如果它们都有问题,那我就明白了,为什么a中的vec没有被删除?
这是否仅仅是因为编译器可以理解第一个示例,但第二个示例很难理解?

ovfsdjhp

ovfsdjhp1#

一句话:a是临时的,而b不是。
temp是一个变量;变量总是被丢弃在封闭作用域的末尾。作用域在我们赋给b之前结束。
相比之下,a中的vec![]是临时变量,因为它没有被赋值给变量。临时变量通常在语句的末尾被丢弃,然而,因为语句是let声明,所以它内部的临时变量受到临时生存期扩展,并且其生存期被扩展以匹配a本身的生存期,即,直到a的封闭块为止。
请注意,准确地说,temp也被分配了一个临时的,这个临时的生命期会被临时延长--但是它延长的生命期与temp的生命期匹配,因为它是声明的一部分。

相关问题