Rust 临时值被释放
为什么会生成“临时值已释放”错误: 有效时:Rust 临时值被释放,rust,Rust,为什么会生成“临时值已释放”错误: 有效时: let mut new_string = String::from("test"); new_string.push_str( &format!("{}","ay") ); 操场格式返回一个字符串(不带&),因此您可以拥有它返回的内容。您可以说当前区块拥有它。然后在当前块的末尾删除它 在 这是{&format!(“{}”,“ay”)}。在}可以使用该值之前,该值会被删除 在 它的寿命足够长 new_s
let mut new_string = String::from("test");
new_string.push_str(
&format!("{}","ay")
);
操场
格式
返回一个字符串(不带&
),因此您可以拥有它返回的内容。您可以说当前区块拥有它。然后在当前块的末尾删除它
在
这是{&format!(“{}”,“ay”)}
。在}
可以使用该值之前,该值会被删除
在
它的寿命足够长
new_string.push_str({&format!(“{}”,“ay”)})代码>之所以有效,是因为花括号已优化
new_string.push_str( {
let t = &format!("{}","ay");
t
} );
不起作用。临时生命周期不可用。在这个特殊情况下,引用并不完全清楚,但从编译器的行为来看,它看起来像是format!()
在第一种情况下一直存在到块的末尾,而在第二种情况下一直存在到push_str()
调用的末尾。第一种情况下的“block”只是if-expression的“then”分支。参考文献中的措辞听起来像是临时表达式在第一种情况下应该寿命更长,不过:“block的尾部表达式被认为是包含block的语句的一部分”好的,这很有意义。。。但是为什么这样做呢:new_string.push_str({&format!(“{}”,“ay”)})代码>我认为引用有点太模糊,无法完全理解临时生命周期。我找到了更充分的解释。这里解释的“竞技场树”似乎与您提到的所有情况下观察到的行为完全一致。
let mut new_string = String::from("test");
new_string.push_str(
if true { &format!("{}","ay") } else { "ay" }
);
let mut new_string = String::from("test");
new_string.push_str(
&format!("{}","ay")
);
new_string.push_str( {
let t = &format!("{}","ay");
t
} );