Уроки модуля (1/2)
Определение и создание экземпляров структур
Структуры (или структуры) в Rust — это пользовательские типы данных, которые позволяют группировать несколько связанных значений вместе. Они похожи на объекты или классы в других языках, но без наследования.
Определение структуры
Чтобы определить структуру, мы используем ключевое слово struct, за которым следует имя в PascalCase. Внутри мы определяем имена и типы полей:
struct User {
username: String,
email: String,
active: bool,
sign_in_count: u64,
}Создание экземпляра
Чтобы использовать структуру, мы должны создать экземпляр, заполнив все указанные поля:
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 не позволяет помечать изменяемыми только определенные поля:
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 также поддерживает два других формата структур помимо классических структур с именованными полями:
- Структуры кортежей: у них есть связанное имя, но поля не имеют индивидуальных имен, а имеют только типы. Они полезны для определения и дифференциации конкретных типов:
Rust
struct Point(i32, i32, i32); let origin = Point(0, 0, 0); - Юнит-подобные структуры: они не определяют никаких полей. Они ведут себя как устройства типа
(). Они полезны, когда вам нужно реализовать поведение (признаки) типа без хранения в нем каких-либо данных.
Попробуйте сами
Определите структуру User над основной с полями: имя пользователя (тип String) и активный (тип bool).
Показать подсказку
Напишите `struct User { имя пользователя: String, active: bool }`before`main`.
Решение доступно после 3 попыток
Измените user1, чтобы сделать его изменяемым (дайте mut user1), и измените активное поле на false перед печатью.
Показать подсказку
Добавьте `mut`to`let user1`, чтобы получилось `let mut user1`, затем вставьте `user1.active = false;`.
Решение доступно после 3 попыток
Определите структуру кортежа с именем 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 попыток