来自 C++,我很惊讶这段代码在 Rust 中是有效的:
let x = &mut String::new();
x.push_str("Hello!");
在 C++ 中,您无法获取临时值的地址,并且临时值的寿命不会比它出现的表达式的寿命长。
临时在 Rust 中存在多久?自从x
只是借用,那么该字符串的所有者是谁?
为什么临时借用是合法的?
它是合法的,就像它在 C++ 中是非法的一样 —因为有人说事情就应该如此 https://doc.rust-lang.org/1.48.0/reference/destructors.html#temporary-scopes.
临时在 Rust 中存在多久?自从x
只是借用,那么该字符串的所有者是谁?
参考文献说 https://doc.rust-lang.org/1.48.0/reference/destructors.html#temporary-scopes:
表达式的临时范围是
包含表达式且适用于以下其中一项的最小范围:
- 整个函数体。
- 一份声明。
- 一个的身体if https://doc.rust-lang.org/1.48.0/reference/expressions/if-expr.html#if-expressions, while https://doc.rust-lang.org/1.48.0/reference/expressions/loop-expr.html#predicate-loops or loop https://doc.rust-lang.org/1.48.0/reference/expressions/loop-expr.html#infinite-loops表达。
- The
else
块的if
表达。
- 的条件表达式
if
or while
表达式,或match
guard.
- 火柴臂的表达式。
- a 的第二个操作数惰性布尔表达式 https://doc.rust-lang.org/1.48.0/reference/expressions/operator-expr.html#lazy-boolean-operators.
本质上,您可以将代码视为:
let mut a_variable_you_cant_see = String::new();
let x = &mut a_variable_you_cant_see;
x.push_str("Hello!");
也可以看看:
- 为什么我可以返回对本地文字的引用而不是变量? https://stackoverflow.com/q/50345139/155423
- 未命名值的范围是什么? https://stackoverflow.com/q/47044453/155423
- Rust 中指向临时变量的原始指针可以吗? https://stackoverflow.com/q/41815619/155423
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)