0Pricing
Learn Rust Coding · Урок

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

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

«Определение и использование структур» — бесплатный урок Learn Rust Coding на CoddyKit. Это урок 1 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Learn Rust Coding, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Learn Rust Coding содержит 3 уроков всего.

Знакомство со структурами: пользовательские типы данных

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

Представьте структуру как чертёж для пользователя, цвета или точки в пространстве. Вместо отдельных переменных для имени, электронной почты и возраста пользователя можно поместить их все в структуру User.

Это помогает логично организовать данные и делает код более понятным и удобным для сопровождения.

Определение классической структуры

Самый распространённый тип структуры — классическая структура, в которой каждому элементу данных, называемому полем, присваивается имя. Вот как её определить:

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

fn main() {
    // This code only defines the struct blueprint.
    // No actual user has been created yet!
    println!("Struct 'User' blueprint defined.");
}

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

Определив структуру, вы можете создавать её конкретные экземпляры. Каждый экземпляр хранит определённые значения своих полей. Чтобы создать экземпляр, укажите конкретное значение для каждого поля.

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

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

Доступ к полям структуры

Чтобы получить данные из экземпляра структуры, используется точечная нотация. Просто укажите имя экземпляра, точку (.), а затем имя поля.

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

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

Изменяемость структур

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

Нельзя сделать изменяемыми только отдельные поля: изменяемость применяется ко всему экземпляру структуры.

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

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

Кортежные структуры: безымянные поля

Кортежные структуры — ещё одна форма структур. Они похожи на кортежи, но имеют имя. Они полезны, когда кортежу нужно присвоить отдельное имя типа, но нет необходимости давать имена отдельным полям.

Например, Color(i32, i32, i32) — именованный кортеж, объединяющий три целых числа.

struct Color(i32, i32, i32);
struct Point(i32, i32, i32);

fn main() {
    let black = Color(0, 0, 0);
    let origin = Point(0, 0, 0);
    println!("Tuple structs 'Color' and 'Point' defined.");
}

Использование кортежных структур

Создание экземпляра кортежной структуры похоже на создание обычного кортежа. Чтобы обратиться к значениям внутри, используется точечная нотация с их индексом, начиная с 0.

struct Color(i32, i32, i32);
struct Point(i32, i32, i32);

fn main() {
    let black = Color(0, 0, 0);
    let origin = Point(0, 0, 0);

    println!("Black color: R={}, G={}, B={}", black.0, black.1, black.2);
    println!("Origin point: X={}, Y={}, Z={}", origin.0, origin.1, origin.2);
}

Структуры без полей: маркеры

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

Их часто используют как маркеры для реализации определённого трейта для типа, когда сами данные не важны.

struct AlwaysTrue;

fn main() {
    let subject = AlwaysTrue;
    // Unit-like structs don't store data directly,
    // but they can be instantiated and used as types.
    println!("Unit-like struct 'AlwaysTrue' created.");
}

Синтаксис обновления структуры

Если нужно создать новый экземпляр структуры на основе существующего, изменив лишь некоторые значения полей, Rust предлагает удобный синтаксис обновления структуры (..).

Этот синтаксис перемещает остальные поля из указанного экземпляра, поэтому исходный экземпляр больше нельзя использовать, если он содержит поля, реализующие Copy.

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

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

    let user2 = User {
        email: String::from("bob@example.com"),
        username: String::from("bob456"),
        ..user1 // Copy remaining fields from user1
    };

    println!("User 2 email: {}", user2.email);
    println!("User 2 active: {}", user2.active);
    // user1.username is now moved, so user1 can't be used here.
}

Тест по структурам

Проверьте, насколько хорошо вы поняли структуры Rust.

Повторение: обзор структур

Вы научились определять и использовать структуры в Rust!

  • Классические структуры объединяют именованные поля для создания пользовательских типов данных.
  • Кортежные структуры — это именованные кортежи, полезные, когда имена полей не обязательны.
  • Структуры без полей не содержат полей и выступают в роли маркеров.
  • Экземпляры структур можно сделать mut, чтобы разрешить изменение их полей.
  • Синтаксис .. помогает создавать новые экземпляры на основе существующих.

Структуры играют ключевую роль в организации связанных данных в программах на Rust, делая код более структурированным и понятным.

Часто задаваемые вопросы

Урок «Определение и использование структур» бесплатный?

Да — полный текст урока «Определение и использование структур» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Learn Rust Coding, подпишись на CoddyKit PRO. Курс Learn Rust Coding содержит 3 уроков всего.

Чему я научусь в уроке «Определение и использование структур»?

Создавайте собственные структуры данных с помощью структур, включая кортежные структуры и структуры без полей, чтобы объединять связанные данные. Ты практикуешь Learn Rust Coding с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Learn Rust Coding?

Предыдущий опыт не требуется. Learn Rust Coding на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 3.

Сколько времени занимает урок «Определение и использование структур»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Learn Rust Coding?

Да. Каждый урок Learn Rust Coding включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Определение и использование структур
  2. Перечисления для пользовательских типов
  3. Мощное сопоставление с образцом
← Назад к Learn Rust Coding