此代码无法编译:
let y = { let x = "foo".to_owned(); &x }; dbg!(y);
但这段代码可以:
let y = { let x = "foo".to_owned(); &x.clone() }; dbg!(y);
我以为我们不能返回对局部变量的引用,但在这个例子中我们可以。x.clone()是在块内部创建的,但我们可以在块外部获得对它的引用。然而我们不能在x上做同样的事情。这里发生了什么?
x.clone()
x
ffx8fchx1#
临时生存期延长的规则有点复杂,但是这个问题中的两个代码片段的区别可以归结为:
只有在块的最终表达式中创建的值才会应用生存期扩展。
clone()
在Rust参考文献中是这样解释的:对于带有初始化式的let语句,扩展表达式是......任何扩展块表达式的最终表达式。...任何扩展借位表达式的操作数都扩展了其临时作用域。-- rust eclipse 参考第10.8节,临时寿命延长另见:(Code in Rust Playground)
1条答案
按热度按时间ffx8fchx1#
临时生存期延长的规则有点复杂,但是这个问题中的两个代码片段的区别可以归结为:
只有在块的最终表达式中创建的值才会应用生存期扩展。
clone()
的返回值的生存期延长了,因为它是在块的最终表达式中创建的。x
不是一个 temporary,而是一个实际的命名变量。在Rust参考文献中是这样解释的:
对于带有初始化式的let语句,扩展表达式是......任何扩展块表达式的最终表达式。
...
任何扩展借位表达式的操作数都扩展了其临时作用域。
-- rust eclipse 参考第10.8节,临时寿命延长
另见:
(Code in Rust Playground)