Ключевое слово struct

Тип, который состоит из других типов.

Структуры в Rust бывают трёх видов: структуры с именованными полями, кортежные структуры и unit-структуры.

#![allow(unused)]
fn main() {
struct Regular {
    field1: f32,
    field2: String,
    pub field3: bool
}

struct Tuple(u32, String);

struct Unit;
}

Виды структур

Обычные структуры (с именованными полями) используются наиболее часто. Каждое поле, определённое в них, имеет имя и тип, и после определения к нему можно обращаться с помощью синтаксиса example_struct.field. Поля структуры разделяют её изменяемость, поэтому foo.bar = 2; будет допустимо только если foo является изменяемым. Добавление pub к полю делает его видимым для кода в других модулях, а также позволяет напрямую обращаться к нему и изменять его.

Кортежные структуры похожи на обычные структуры, но их поля не имеют имён. Они используются как кортежи, с возможностью деструктуризации через синтаксис let TupleStruct(x, y) = foo;. Для доступа к отдельным переменным используется тот же синтаксис, что и с обычными кортежами, а именно foo.0, foo.1 и т.д., начиная с нуля.

Unit-структуры чаще всего используются как маркеры. Они имеют размер ноль байт, но в отличие от пустых перечислений могут быть созданы, что делает их изоморфными unit-типу (). Unit-структуры полезны, когда вам нужно реализовать трейт для чего-то, но не нужно хранить внутри какие-либо данные.

Создание экземпляров

Структуры могут быть созданы разными способами, все из которых можно комбинировать по необходимости. Наиболее распространённый способ создания новой структуры — через метод-конструктор, такой как new(), но когда он недоступен (или вы пишете сам конструктор), используется синтаксис литералов структур:

#![allow(unused)]
fn main() {
let example = Foo {
    field1: 42.0,
    field2: "blah".to_string(),
    etc: true,
};
}

Непосредственно создать структуру с помощью синтаксиса литералов структур возможно только тогда, когда все её поля видимы для вас.

Существует несколько сокращений для удобства написания конструкторов, наиболее распространённым из которых является сокращённая инициализация полей. Когда существует переменная и поле с одинаковым именем, присваивание может быть упрощено с field: field до просто field. Следующий пример гипотетического конструктора демонстрирует это:

#![allow(unused)]
fn main() {
struct User {
    name: String,
    admin: bool,
}

impl User {
    pub fn new(name: String) -> Self {
        Self {
            name,
            admin: false,
        }
    }
}
}

Другое сокращение для создания структур доступно, когда вам нужно создать новую структуру, которая имеет те же значения, что и большая часть предыдущей структуры того же типа, называемое синтаксисом обновления структуры:

#![allow(unused)]
fn main() {
let updated_thing = Foo {
    field1: "a new value".to_string(),
    ..thing
};
}

Кортежные структуры создаются так же, как и сами кортежи, за исключением того, что перед ними ставится имя структуры: Foo(123, false, 0.1).

Пустые структуры создаются просто с помощью их имени и больше ничего не требуют: let thing = EmptyStruct;

Соглашения о стиле

Структуры всегда пишутся в UpperCamelCase, за редкими исключениями. Хотя завершающая запятая в списке полей структуры может быть опущена, её обычно оставляют для удобства добавления и удаления полей в будущем.

Для получения дополнительной информации о структурах ознакомьтесь с книгой по Rust или Справочником.