Перейти к основному содержимому
Модуль 4 · Урок 1 из 27/14 в курсе~12 min
Уроки модуля (1/2)

Определение и создание экземпляров структур

Структуры (или структуры) в Rust — это пользовательские типы данных, которые позволяют группировать несколько связанных значений вместе. Они похожи на объекты или классы в других языках, но без наследования.

Определение структуры

Чтобы определить структуру, мы используем ключевое слово struct, за которым следует имя в PascalCase. Внутри мы определяем имена и типы полей:

Rust
struct User {
    username: String,
    email: String,
    active: bool,
    sign_in_count: u64,
}

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

Чтобы использовать структуру, мы должны создать экземпляр, заполнив все указанные поля:

Rust
fn main() {
    let user1 = User {
        email: String::from("alice@example.com"),
        username: String::from("alice123"),
        active: true,
        sign_in_count: 1,
    };

    // Access fields using dot notation
    println!("Is user {} active? {}", user1.username, user1.active);
}

Структурная изменчивость

В Rust весь экземпляр должен быть помечен как изменяемый (mut), если вы хотите изменить любое из его полей. Rust не позволяет помечать изменяемыми только определенные поля:

Rust
fn main() {
    let mut user1 = User {
        email: String::from("alice@example.com"),
        username: String::from("alice123"),
        active: true,
        sign_in_count: 1,
    };

    user1.active = false; // Valid because user1 is mutable!
}

Кортежные структуры и модульные структуры

Rust также поддерживает два других формата структур помимо классических структур с именованными полями:

  1. Структуры кортежей: у них есть связанное имя, но поля не имеют индивидуальных имен, а имеют только типы. Они полезны для определения и дифференциации конкретных типов:
    Rust
    struct Point(i32, i32, i32);
    let origin = Point(0, 0, 0);
  2. Юнит-подобные структуры: они не определяют никаких полей. Они ведут себя как устройства типа (). Они полезны, когда вам нужно реализовать поведение (признаки) типа без хранения в нем каких-либо данных.

Попробуйте сами

Упражнение#rust.m4.l1.e1
Попыток: 0Загрузка…

Определите структуру User над основной с полями: имя пользователя (тип String) и активный (тип bool).

Загрузка редактора…
Показать подсказку

Напишите `struct User { имя пользователя: String, active: bool }`before`main`.

Решение доступно после 3 попыток

Упражнение#rust.m4.l1.e2
Попыток: 0Загрузка…

Измените user1, чтобы сделать его изменяемым (дайте mut user1), и измените активное поле на false перед печатью.

Загрузка редактора…
Показать подсказку

Добавьте `mut`to`let user1`, чтобы получилось `let mut user1`, затем вставьте `user1.active = false;`.

Решение доступно после 3 попыток

Упражнение#rust.m4.l1.e3
Попыток: 0Загрузка…

Определите структуру кортежа с именем Color, содержащую три поля i32. В main создайте экземпляр Color со значениями 255, 0 и 100, присвоив его переменной my_color, затем напечатайте его первый элемент (красное значение) с помощью println!.

Загрузка редактора…
Показать подсказку

Определите структуру кортежа с помощью `struct Color(i32, i32, i32);`. В основном создайте его экземпляр как `let my_color = Color(255, 0, 100);`и напечатайте красное значение с`my_color.0`.

Решение доступно после 3 попыток