Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Выражения доступа к полям

Syntax
FieldExpressionExpression . 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
}