在此代码中:
fn main() {
let a = {
&mut vec![1]
};
let b = {
let temp = &mut vec![1];
temp
};
println!("{a:?} {b:?}");
}
为什么a
有效而b
无效("借用时临时值丢失[E0716]")?
如果它们都有问题,那我就明白了,为什么a
中的vec没有被删除?
这是否仅仅是因为编译器可以理解第一个示例,但第二个示例很难理解?
1条答案
按热度按时间ovfsdjhp1#
一句话:
a
是临时的,而b
不是。temp
是一个变量;变量总是被丢弃在封闭作用域的末尾。作用域在我们赋给b
之前结束。相比之下,
a
中的vec![]
是临时变量,因为它没有被赋值给变量。临时变量通常在语句的末尾被丢弃,然而,因为语句是let
声明,所以它内部的临时变量受到临时生存期扩展,并且其生存期被扩展以匹配a
本身的生存期,即,直到a
的封闭块为止。请注意,准确地说,
temp
也被分配了一个临时的,这个临时的生命期会被临时延长--但是它延长的生命期与temp
的生命期匹配,因为它是声明的一部分。