字段访问表达式

语法

FieldExpression :

   表达式 . 标识符

字段访问表达式是一种位置表达式,它计算结果为结构体或联合体字段的位置。当操作数是可变的时,字段访问表达式也是可变的。

字段访问表达式的语法是一个表达式(称为容器操作数),然后是一个.,最后是一个标识符。字段访问表达式后面不能跟括号括起来的逗号分隔的表达式列表,因为这会被解析为方法调用表达式。也就是说,它们不能作为调用表达式的函数操作数。

注意:将字段访问表达式放在括号表达式中,以便在调用表达式中使用它。

#![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

自动解引用

如果容器操作数的类型实现了DerefDerefMut(取决于操作数是否可变),则它会被自动解引用多次,直到可以进行字段访问。这个过程也被简称为自动解引用

借用

在借用时,结构体的字段或对结构体的引用被视为独立的实体。如果结构体没有实现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
}