【发布时间】:2019-11-30 20:03:56
【问题描述】:
为什么会产生“临时值被释放”的错误:
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")
);
游乐场Link
【问题讨论】:
-
临时生命周期为specified to some extent in the Rust reference。在这种特殊情况下,引用并不完全清楚,但从编译器的行为来看,
format!()返回的临时值在第一种情况下一直存在到 block 结束,而在第二种情况下,它会一直持续到push_str()调用结束。第一种情况下的“块”只是 if 表达式的“then”分支。 -
参考中的措辞听起来像是临时的应该在第一种情况下存活更长的时间,但是:“块的尾部表达式被认为是包含块的语句的一部分”
-
好吧,这很有道理......但是为什么这会起作用:
new_string.push_str( {&format!("{}","ay")} ); -
我认为这个参考有点太模糊,无法完全理解临时生命周期。我找到了更完整的解释in this issue。那里解释的“竞技场树”确实似乎与您提到的所有情况下观察到的行为完全一致。
标签: rust