Перейти к основному содержимому
  1. Rust/

Создание и использование структур в Rust: Полное руководство

·1293 слова·7 минут· loading · loading · · ·Rust-basic
О Rust - Эта статья часть цикла.
Статей прочитано 0/38
0%
📚 Введение и дополнительные материалы
🟢 Начальный уровень (Rust-basic)
10 Создание и использование структур в Rust: Полное руководство (текущая)
Не прочитана
Не прочитана
🔵 Средний уровень (Rust-middle)

Введение. Что такое структура
#

Структура (или 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 поддерживает три основных вида структур:

  1. Структуры с именованными полями (классические C-структуры).
  2. Структуры-кортежи (Tuple Structs).
  3. Юнит-структуры (Unit-like Structs).

Давайте изучим все виды структур, сокращенную инициализацию, синтаксис перехода (..) и правила видимости полей на интерактивных слайдах ниже:

Структуры в Rust
Шаг 1/6
 1#[allow(dead_code)]
 2#[derive(Debug)]
 3struct Hub {
 4    name: String,
 5    id: String,
 6    location: String,
 7    sensors: Vec<Sensor>,
 8}
 9
10#[allow(dead_code)]
11#[derive(Debug)]
12struct Sensor {
13    name: String,
14    id: String,
15    sensor_type: String,
16    value: f32,
17    unit: String,
18    is_active: bool,
19}
20
21fn main() {
22    let hub = Hub {
23        name: "Main Hub".to_string(),
24        id: String::from("HUB001"),
25        location: "Room 101".to_string(),
26        sensors: Vec::new(), // пустой список сенсоров
27    };
28
29    println!("{:#?}", hub);
30}

Объявление и базовая инициализация структур

  • Структуры определяются с помощью ключевого слова struct.
  • Атрибут #[derive(Debug)] позволяет выводить структуру в отладочном формате с помощью {:#?}.

Детали реализации и шаги:
#

  1. Шаг 1. Определение и базовая инициализация:

    • Мы определили классические структуры с именованными полями Hub и Sensor.
    • Инициализировали экземпляр структуры Hub с пустым вектором sensors (Vec::new()).
  2. Шаг 2. Структуры со вложенными коллекциями:

    • Мы создали два сенсора и проинициализировали структуру Hub, передав сенсоры во вложенный массив с помощью макроса vec!.
  3. Шаг 3. Сокращенный синтаксис и синтаксис перехода:

    • Field Init Shorthand: Если имена переменных совпадают с именами полей структуры, мы можем просто указать имя переменной (например, let x = Foo { a, b };).
    • Struct Update Syntax: С помощью .. мы можем скопировать или перенести значения оставшихся полей из другого экземпляра структуры (например, let y = Foo { a: 50, ..x };).
  4. Шаг 4. Структуры-кортежи (Tuple Structs):

    • Именованный тип, поля которого не имеют названий, а определяются только типами в круглых скобках: struct Bar(u32, bool);.
    • Доступ к полям осуществляется по порядковому индексу: x.0, x.1.
    • Тип структуры-кортежа является функцией-конструктором: let constructor: fn(u32, bool) -> Bar = Bar;.
    • Часто используется для паттерна Newtype (создание безопасной обертки вокруг одного типа).
  5. Шаг 5. Юнит-структуры (Unit-like Structs):

    • Объявляются с помощью ключевого слова struct вообще без использования скобок: struct Baz;.
    • Создаются аналогично без скобок: let x = Baz;.
  6. Шаг 6. Видимость и управление доступом к полям:

    • По умолчанию все поля приватны (доступны только внутри текущего модуля).
    • Модификаторы видимости управляют доступом:
      • pub — поле публично везде.
      • pub(crate) — поле видимо только внутри текущего крейта.
      • pub(super) — поле видимо только родительскому модулю.

Примечание по видимости: Даже если поле структуры помечено как pub, сама структура должна быть доступна (публична) внешнему коду, чтобы поля можно было прочитать.


Проверь свои знания!
#

Пройдите короткий интерактивный тест, чтобы закрепить понимание структур в Rust.

История обновлений

  • Установил уровень сложности rust-basic для статьи.
  • Дополнил статью информацией о структурах-кортежах, юнит-структурах, сокращенной инициализации и управлении видимостью полей.
  • Добавил примеры с кодом для демонстрации создания и использования структур (struct).
Статья прочитана
Пожалуйста, оцените насколько статья была вам полезна и понятна
Цикл статей
О Rust - Эта статья часть цикла.
Статей прочитано 0/38
0%
📚 Введение и дополнительные материалы
🟢 Начальный уровень (Rust-basic)
10 Создание и использование структур в Rust: Полное руководство (текущая)
Не прочитана
Не прочитана
🔵 Средний уровень (Rust-middle)

Связанные статьи