Learn Rust Coding · Урок

Векторы структур

Храните сложные данные в Vec.

Урок 4 из 413 шагов

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

Зачем нужны векторы структур

Векторы могут хранить значения любого одного типа, включая созданные вами структуры. В Vec<Person> можно хранить много объектов типа Person в определённом порядке — это удобно для списков записей, например пользователей, элементов или оценок.

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

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

Сначала определите структуру, которую хотите хранить. У этой структуры Person есть имя и возраст.

Строка #[derive(Debug)] позволяет выводить объект типа Person с помощью {:?}, что удобно для вывода целых векторов.

#[derive(Debug)]
struct Person {
    name: String,
    age: u32,
}

Создание вектора

Создайте экземпляры структуры, а затем соберите их в макросе vec!. Тип вектора автоматически определяется как Vec<Person>.

Используйте {:?}, чтобы вывести все записи сразу.

#[derive(Debug)]
struct Person { name: String, age: u32 }

fn main() {
    let people = vec![
        Person { name: String::from("Ann"), age: 30 },
        Person { name: String::from("Bo"), age: 25 },
    ];
    println!("{:?}", people);
}

Добавление структур с помощью push

Можно также начать с пустого вектора и добавлять структуры по одной с помощью push. Чтобы увеличивать вектор, он должен быть объявлен как mut.

Такой подход подходит, когда записи поступают со временем, например из пользовательского ввода.

#[derive(Debug)]
struct Item { name: String }

fn main() {
    let mut cart = Vec::new();
    cart.push(Item { name: String::from("Pen") });
    cart.push(Item { name: String::from("Mug") });
    println!("{:?}", cart);
}

Перебор записей

Перебирайте &people, чтобы читать каждую структуру, не забирая право владения. Внутри цикла обращайтесь к полям через точечную запись, например p.name.

Так для каждой записи выводится понятная строка.

#[derive(Debug)]
struct Person { name: String, age: u32 }

fn main() {
    let people = vec![
        Person { name: String::from("Ann"), age: 30 },
        Person { name: String::from("Bo"), age: 25 },
    ];
    for p in &people {
        println!("{} is {}", p.name, p.age);
    }
}

Чтение одного поля

Обратитесь по индексу к нужной структуре вектора, а затем используйте точечную запись для доступа к её полю. Например, people[0].name возвращает имя первого объекта Person.

Помните: индексы начинаются с 0, а обращение за пределами вектора приводит к панике.

#[derive(Debug)]
struct Person { name: String, age: u32 }

fn main() {
    let people = vec![
        Person { name: String::from("Ann"), age: 30 },
    ];
    println!("name: {}", people[0].name);
}

Изменение поля

Чтобы изменить запись, вектор должен быть объявлен как mut. Затем обратитесь по индексу к структуре и присвойте значение её полю, например people[0].age = 31.

Так сохранённые данные обновляются прямо на месте.

struct Person { name: String, age: u32 }

fn main() {
    let mut people = vec![
        Person { name: String::from("Ann"), age: 30 },
    ];
    people[0].age = 31;
    println!("{}", people[0].age);
}

Суммирование поля

Итераторы могут извлечь одно поле из каждой записи. Здесь iter().map(|p| p.age).sum() складывает значения возраста всех объектов.

Шаг map превращает каждый объект Person только в его возраст перед суммированием.

struct Person { name: String, age: u32 }

fn main() {
    let people = vec![
        Person { name: String::from("Ann"), age: 30 },
        Person { name: String::from("Bo"), age: 20 },
    ];
    let total: u32 = people.iter().map(|p| p.age).sum();
    println!("total age = {}", total);
}

Фильтрация записей

Используйте iter().filter(...), чтобы оставить записи, соответствующие правилу. Замыкание возвращает логическое значение для каждой структуры.

Здесь мы подсчитываем, сколько объектов Person имеют возраст не менее 30 лет.

struct Person { name: String, age: u32 }

fn main() {
    let people = vec![
        Person { name: String::from("Ann"), age: 30 },
        Person { name: String::from("Bo"), age: 20 },
    ];
    let adults = people.iter().filter(|p| p.age >= 30).count();
    println!("adults: {}", adults);
}

Сортировка по полю

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

Вектор должен быть объявлен как mut, поскольку сортировка меняет его порядок.

#[derive(Debug)]
struct Person { name: String, age: u32 }

fn main() {
    let mut people = vec![
        Person { name: String::from("Ann"), age: 30 },
        Person { name: String::from("Bo"), age: 20 },
    ];
    people.sort_by_key(|p| p.age);
    println!("{:?}", people);
}

Подсчёт записей

Количество сохранённых структур — это просто len(), как и для любого вектора. Оно показывает, сколько записей сейчас хранится.

Используйте его вместе с is_empty(), чтобы перед чтением первой записи проверить, что вектор не пуст.

struct Item { name: String }

fn main() {
    let cart = vec![
        Item { name: String::from("Pen") },
        Item { name: String::from("Mug") },
    ];
    println!("items: {}", cart.len());
}

Быстрая проверка

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

Повторение

Вы хранили структуры в Vec, создавали вектор с помощью vec! и push, а также читали и изменяли поля по индексу и в циклах.

Вы также суммировали и фильтровали записи, сортировали их по полю и подсчитывали их количество. Теперь вы умеете управлять списками структурированных данных с помощью векторов.

Можно начать бесплатно

Изучай Rust с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
39
Уроки
144

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

Урок «Векторы структур» бесплатный?

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

Чему я научусь в уроке «Векторы структур»?

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

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

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

Сколько времени занимает урок «Векторы структур»?

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

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

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

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

  1. Создание и заполнение векторов
  2. Индексация и итерация
  3. Увеличение и уменьшение
  4. Векторы структур
← Назад к Learn Rust Coding