Выражения доступа к полям
Syntax
FieldExpression → Expression . IDENTIFIER
Выражение доступа к полю — это выражение-место, которое вычисляется в местоположение поля структуры или объединения.
Когда операнд изменяем, выражение доступа к полю также является изменяемым.
Синтаксис выражения доступа к полю: выражение, называемое операндом-контейнером, затем ., и, наконец, идентификатор.
Выражения доступа к полям не могут следовать за заключенным в круглые скобки списком выражений, разделенных запятыми, так как это вместо этого парсится как выражение вызова метода. То есть они не могут быть функциональным операндом выражения вызова.
Note
Оберните выражение доступа к полю в выражение в скобках, чтобы использовать его в выражении вызова.
#![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 в зависимости от того, является ли операнд изменяемым, он автоматически разыменовывается столько раз, сколько необходимо, чтобы сделать доступ к полю возможным.
Этот процесс также сокращенно называется autoderef.
Заимствование
Поля структуры или ссылки на структуру рассматриваются как отдельные сущности при заимствовании.
Если структура не реализует 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 }