Изменяемые структуры
Часть раздела Logic & Flow путешествия по Rust на Coddy — урок 23 из 66.
По умолчанию экземпляры структур в Rust являются неизменяемыми — после их создания вы не можете изменять значения их полей. Однако, как и в случае с другими переменными, вы можете сделать экземпляр структуры изменяемым, добавив ключевое слово mut при его объявлении.
Когда вы объявляете экземпляр структуры как изменяемый (mutable), вы можете изменять любое из его полей, используя точечную нотацию:
let mut player = Player {
name: String::from("Alice"),
score: 0,
};
player.score = 100; // Это работает, потому что player является изменяемымБез ключевого слова mut попытка изменить поле приведет к ошибке компиляции. Изменяемость применяется ко всему экземпляру структуры — вы не можете сделать отдельные поля изменяемыми, оставляя другие неизменяемыми.
Задание
ЛегкоВы получите четыре входных значения: имя игрока, начальный счет (целое число), бонусные очки для добавления (целое число) и финальную корректировку счета (целое число). Определите структуру Player с двумя полями: name типа String и score типа i32. Создайте изменяемый (mutable) экземпляр этой структуры, затем несколько раз измените поле score, используя входные значения.
Требования:
- Определите структуру
Playerс полями:name: Stringиscore: i32 - Прочитайте первый входной параметр как имя игрока
- Прочитайте второй входной параметр и преобразуйте его в
i32для начального счета - Создайте изменяемый (mutable) экземпляр структуры
Playerс этими значениями - Прочитайте третий входной параметр и преобразуйте его в
i32для бонусных очков - Добавьте бонусные очки к текущему счету игрока, используя точечную нотацию
- Прочитайте четвертый входной параметр и преобразуйте его в
i32для финальной корректировки - Добавьте финальную корректировку к текущему счету игрока
- Выведите информацию об игроке в точном формате, указанном ниже
Ввод:
- Первая строка: Имя игрока (например,
Alice) - Вторая строка: Начальный счет как целое число (например,
50) - Третья строка: Бонусные очки как целое число (например,
30) - Четвертая строка: Финальная корректировка как целое число (например,
20)
Вывод:
- Первая строка:
Player: [name] - Вторая строка:
Final Score: [score]
Шпаргалка
Экземпляры структур в Rust по умолчанию неизменяемы. Чтобы изменить значения полей после создания, объявите экземпляр как изменяемый с помощью ключевого слова mut:
let mut player = Player {
name: String::from("Alice"),
score: 0,
};
player.score = 100; // Изменение поля с помощью точечной нотацииИзменяемость применяется ко всему экземпляру структуры — вы не можете сделать отдельные поля изменяемыми, оставляя другие неизменяемыми.
Попробуйте сами
use std::io;
// TODO: Определите здесь структуру Player с полями name и score
fn main() {
// Чтение имени игрока
let mut name = String::new();
io::stdin().read_line(&mut name).expect("Failed to read line");
let name = name.trim().to_string();
// Чтение начального счета
let mut initial_score = String::new();
io::stdin().read_line(&mut initial_score).expect("Failed to read line");
let initial_score: i32 = initial_score.trim().parse().expect("Invalid number");
// Чтение бонусных очков
let mut bonus = String::new();
io::stdin().read_line(&mut bonus).expect("Failed to read line");
let bonus: i32 = bonus.trim().parse().expect("Invalid number");
// Чтение финальной корректировки
let mut adjustment = String::new();
io::stdin().read_line(&mut adjustment).expect("Failed to read line");
let adjustment: i32 = adjustment.trim().parse().expect("Invalid number");
// TODO: Создайте изменяемый экземпляр Player
// TODO: Добавьте бонусные очки к счету игрока
// TODO: Добавьте финальную корректировку к счету игрока
// TODO: Выведите результат в требуемом формате
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Logic & Flow
1Продвинутое управление потоком выполнения
Выражение 'match'Сопоставление нескольких значенийСопоставление диапазоновВыражение 'if let'Циклы как выраженияИтоги — Простой парсер команд4Группировка данных с помощью структур
Что такое структура?Обзор структурДоступ к полям структурыИзменяемые структурыСтруктуры как параметры функцийКортежные структурыИтоги: создание структуры Book7Обработка ошибок с помощью 'Result'
Что такое 'Result'?Использование 'match' с 'Result'is_ok() и is_err()Сокращения: unwrap и expectОператор вопросительного знака '?'Парсинг строк в числаИтоги: функция безопасного деления10Замыкания и анонимные функции
Что такое замыкание?Определение простого замыканияЗамыкания с параметрамиЗахват окруженияИтоги: Простое замыкание-сумматор2Введение в векторы
Что такое вектор?Создание вектораДобавление элементов с помощью pushДоступ к элементам вектораИтерация по векторуИзменяемая итерацияУдаление элементовИтоги — Простой счетчик очков5Пары «ключ-значение» в Hash Map
Что такое Hash Map?Создание Hash MapВставка пар «ключ-значение»Доступ к значениямИтерация по Hash MapОбновление значенияУдаление парыИтоги — Счетчик слов8Проект: Простой инвентарь товаров
Настройка проектаДобавление товараПроверка наличияПродажа товараСобираем всё воедино3Список дел в командной строке
Настройка проектаДобавление задачиПросмотр всех задачУдаление задачиИтоговый код6Обработка отсутствия значения с 'Option'
Что такое 'Option'?Использование 'match' с 'Option'is_some() и is_none()Распаковка 'Option'Метод expectЗначение по умолчанию: unwrap_orИтоги: поиск элемента