字段访问表达式
字段表达式 是一个 place 表达式,它求值为 结构体 或 联合体 的字段的位置。当操作数是 可变的,字段表达式也是可变的。
字段表达式的语法是一个表达式(称为容器操作数),然后是一个 .
,最后是一个 标识符。字段表达式后面不能跟带圆括号的逗号分隔的表达式列表,因为这会被解析为 方法调用表达式。也就是说,它们不能作为 调用表达式 的函数操作数。
注意:将字段表达式包裹在 带括号的表达式 中,以便在调用表达式中使用它。
#![allow(unused)] fn main() { struct HoldsCallable<F: Fn()> { callable: F } let holds_callable = HoldsCallable { callable: || () }; // Invalid: Parsed as calling the method "callable" // holds_callable.callable(); // Valid (holds_callable.callable)(); }
示例
mystruct.myfield;
foo().x;
(Struct {a: 10, b: 20}).a;
(mystruct.function_field)() // Call expression containing a field expression
自动解引用
如果容器操作数的类型实现了 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 borrowed mutably let b: &String = &x.f2; // x.f2 borrowed immutably let c: &String = &x.f2; // Can borrow again let d: String = x.f3; // Move out of x.f3 }