字段访问表达式
字段表达式 是一个 占位表达式 ,它求值为 结构体 或 联合体 的一个字段的地址。
当操作数是 可变的 ,字段表达式也是可变的。
字段表达式的语法是一个表达式 (称为 容器操作数 ) ,然后是 .
,最后是一个 标识符 。
字段表达式不能后跟一个括号内的逗号分隔的表达式列表,因为那将被解析为 方法调用表达式 。
也就是说,它们不能作为 调用表达式 的函数操作数对象。
注意: 在调用表达式中使用字段表达式时,要将其包装在 括号表达式 中。
#![allow(unused)] fn main() { struct HoldsCallable<F: Fn()> { callable: F } let holds_callable = HoldsCallable { callable: || () }; // 无效:被解析为调用 "callable" 方法 // holds_callable.callable(); // 有效 (holds_callable.callable)(); }
示例:
mystruct.myfield;
foo().x;
(Struct {a: 10, b: 20}).a;
(mystruct.function_field)() // 包含字段表达式的调用表达式
自动解引用
如果容器操作数的类型实现了 Deref
或 DerefMut
(取决于操作数是否 可变 ),
则会进行 自动解引用 ,直到使字段访问成为可能为止。
借用
在借用过程中,结构体的字段或结构体的引用被视为独立的实体。
如果结构体没有实现 Drop
并且存储在局部变量中,则移动其每个字段时也适用于此规则。
但如果除了 Box
之外的用户定义类型进行自动解引用,则不适用此规则。
#![allow(unused)] fn main() { struct A { f1: String, f2: String, f3: String } let mut x: A; x = A { f1: "f1".to_string(), f2: "f2".to_string(), f3: "f3".to_string() }; let a: &mut String = &mut x.f1; // 可变地借用 x.f1 let b: &String = &x.f2; // 不可变地借用 x.f2 let c: &String = &x.f2; // 可以再次借用 let d: String = x.f3; // 从 x.f3 中移动值 }