abc*_*987 1 literals rust semantics borrowing
我发现这可以编译:
let x = &mut 10;
*x = 20;
Run Code Online (Sandbox Code Playgroud)
这非常令人困惑。可变借用文字的语义是什么?
我来自C ++,在编译器中绝对不允许我这样引用右值:
let x = &mut 10;
*x = 20;
Run Code Online (Sandbox Code Playgroud)
像C ++一样,Rust具有右值和左值的概念。该引用将它们称为值表达式(rvalue)和位置表达式(lvalue)。此外,还有值上下文和位置上下文(在表达式/语句内部的槽,分别需要值表达式或位置表达式)。
对于在场所上下文中使用值表达式(如文字)(如借位运算符&)的情况,Rust有特殊的规则。从参考:
在大多数位置表达式上下文中使用值表达式时,会创建一个临时的未命名存储位置,并初始化为该值,然后表达式求值到该位置。
因此,Rust自动将您的值存储10在存储位置中。的存储器位置的寿命取决于变化如何值表达式被使用,但在你的情况下,未命名的存储单元具有相同的寿命作为封闭块。因此,它等效于隐藏let绑定:
let _compiler_generated = 10;
let x = &mut _compiler_generated;
*x = 20;
Run Code Online (Sandbox Code Playgroud)
这不仅适用于文字:
fn get_u32() -> u32 { 3 }
let x = &mut get_u32();
*x = 20;
Run Code Online (Sandbox Code Playgroud)
虽然让熟悉对象的生存期的人(如C ++)会感到困惑,但这在某些情况下是一个非常有用的功能。
相关新闻:如果您使用的IM可变引用文字,数值不只是写一个栈槽,但到静态存储器。意思let _: &'static u32 = &10是有效的!这已在RC 1414中指定。
| 归档时间: |
|
| 查看次数: |
209 次 |
| 最近记录: |