Введение. Что такое структура#
Структура (или struct) в Rust — это пользовательский тип данных, который позволяет группировать связанные данные вместе. Структуры похожи на классы в других языках программирования, но в Rust (как говорит документация) они более гибкие и мощные, так как язык предоставляет различные возможности для работы с ними. Кто бы сомневался 😁 При этом видов структур существует несколько.
В этой главе мы подробно рассмотрим как классические C-структуры, так и структуры-кортежи, юнит-структуры, а также способы работы с ними.
Шаг 1. Проектирование структуры#
Прежде чем писать код, важно спроектировать и описать, что мы хотим получить. Давайте возьмем нашу любимую тему по системам для управления умным домом. В нашей системе есть хаб (центральное устройство) и несколько сенсоров, которые подключены к этому хабу.
Диаграмма классов#
classDiagram
class HUB {
+String name
+String id
+String location
+Vec~Sensor~ sensors
}
class Sensor {
+String name
+String id
+String type
+f32 value
+String unit
+bool isActive
}
HUB "1" --> "n" Sensor : хаб хранит сенсоры
Описание структур и полей:#
- Hub:
name: String— имя хаба.id: String— уникальный идентификатор хаба.location: String— местоположение хаба.sensors: Vec<Sensor>— список сенсоров, подключенных к хабу.
- Sensor:
name: String— имя сенсора.id: String— уникальный идентификатор сенсора.sensor_type: String— тип сенсора (например, “температура”, “влажность” и т.д.).value: f32— текущее значение, измеренное сенсором.unit: String— единица измерения (например, “°C”, “%” и т.д.).is_active: bool— статус сенсора (активен/неактивен).
Шаг 2. Разновидности структур и синтаксис инициализации#
Rust поддерживает три основных вида структур:
- Структуры с именованными полями (классические C-структуры).
- Структуры-кортежи (Tuple Structs).
- Юнит-структуры (Unit-like Structs).
Давайте изучим все виды структур, сокращенную инициализацию, синтаксис перехода (..) и правила видимости полей на интерактивных слайдах ниже:
Детали реализации и шаги:#
Шаг 1. Определение и базовая инициализация:
- Мы определили классические структуры с именованными полями
HubиSensor. - Инициализировали экземпляр структуры
Hubс пустым векторомsensors(Vec::new()).
- Мы определили классические структуры с именованными полями
Шаг 2. Структуры со вложенными коллекциями:
- Мы создали два сенсора и проинициализировали структуру
Hub, передав сенсоры во вложенный массив с помощью макросаvec!.
- Мы создали два сенсора и проинициализировали структуру
Шаг 3. Сокращенный синтаксис и синтаксис перехода:
- Field Init Shorthand: Если имена переменных совпадают с именами полей структуры, мы можем просто указать имя переменной (например,
let x = Foo { a, b };). - Struct Update Syntax: С помощью
..мы можем скопировать или перенести значения оставшихся полей из другого экземпляра структуры (например,let y = Foo { a: 50, ..x };).
- Field Init Shorthand: Если имена переменных совпадают с именами полей структуры, мы можем просто указать имя переменной (например,
Шаг 4. Структуры-кортежи (Tuple Structs):
- Именованный тип, поля которого не имеют названий, а определяются только типами в круглых скобках:
struct Bar(u32, bool);. - Доступ к полям осуществляется по порядковому индексу:
x.0,x.1. - Тип структуры-кортежа является функцией-конструктором:
let constructor: fn(u32, bool) -> Bar = Bar;. - Часто используется для паттерна Newtype (создание безопасной обертки вокруг одного типа).
- Именованный тип, поля которого не имеют названий, а определяются только типами в круглых скобках:
Шаг 5. Юнит-структуры (Unit-like Structs):
- Объявляются с помощью ключевого слова
structвообще без использования скобок:struct Baz;. - Создаются аналогично без скобок:
let x = Baz;.
- Объявляются с помощью ключевого слова
Шаг 6. Видимость и управление доступом к полям:
- По умолчанию все поля приватны (доступны только внутри текущего модуля).
- Модификаторы видимости управляют доступом:
pub— поле публично везде.pub(crate)— поле видимо только внутри текущего крейта.pub(super)— поле видимо только родительскому модулю.
Примечание по видимости: Даже если поле структуры помечено как
pub, сама структура должна быть доступна (публична) внешнему коду, чтобы поля можно было прочитать.
Проверь свои знания!#
Пройдите короткий интерактивный тест, чтобы закрепить понимание структур в Rust.
История обновлений
- Установил уровень сложности rust-basic для статьи.
- Дополнил статью информацией о структурах-кортежах, юнит-структурах, сокращенной инициализации и управлении видимостью полей.
- Добавил примеры с кодом для демонстрации создания и использования структур (
struct).


