Векторы структур
Храните сложные данные в Vec.
«Векторы структур» — бесплатный урок 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 — локальная установка не требуется.