Несколько блоков реализации
Часть раздела Объектно-ориентированное программирование путешествия по Rust на Coddy. Урок 5 из 61.
Rust позволяет разделить методы структуры между несколькими блоками impl. Хотя всё можно было бы разместить в одном блоке, их разделение может сделать ваш код более организованным и удобным для чтения.
Вот структура с функциональностью, разделённой на два блока реализации:
struct BankAccount {
balance: f64,
}
// Конструктор и базовые запросы
impl BankAccount {
fn new(initial: f64) -> BankAccount {
BankAccount { balance: initial }
}
fn balance(&self) -> f64 {
self.balance
}
}
// Методы транзакций
impl BankAccount {
fn deposit(&mut self, amount: f64) {
self.balance += amount;
}
fn withdraw(&mut self, amount: f64) {
self.balance -= amount;
}
}
Оба блока работают вместе без каких-либо проблем: Rust рассматривает их как один блок. Вы можете вызвать любой метод независимо от того, в каком блоке он определён:
fn main() {
let mut account = BankAccount::new(100.0);
account.deposit(50.0);
println!("{}", account.balance()); // 150
}
Этот шаблон становится особенно полезным по мере роста ваших структур. Вы можете сгруппировать конструкторы вместе, отделить методы, предназначенные только для чтения, от изменяющих методов или организовать их по функциям. Количество блоков impl для структуры не ограничено.
Задание
ЛегкоСоздайте структуру Player с двумя полями: name (String) и score (u32).
Организуйте методы структуры в двух отдельных блоках реализации:
First impl block: Constructor и query:
new: ассоциированная функция, которая принимаетname: Stringи возвращаетPlayerс установленным значениемscore, равным0get_score: принимает&selfи возвращает текущий score какu32
Second impl block: Изменения score:
add_points: принимает&mut selfиpoints: u32, добавляет points к scorereset_score: принимает&mut selfи устанавливает score обратно в0
Вы получите три входных значения:
- Первая строка: имя игрока (String)
- Вторая строка: points для добавления в первом round (u32)
- Третья строка: points для добавления во втором round (u32)
Создайте игрока using Player::new, добавьте points первого round, выведите score, затем сбросьте score, добавьте points второго round и выведите final score.
Ожидаемый формат вывода:
{score_after_first_round}
{score_after_reset_and_second_round}Попробуйте сами
use std::io;
// TODO: Определите структуру Player с полями name (String) и score (u32)
// TODO: Первый блок impl — конструктор и методы запросов (new, get_score)
// TODO: Второй блок impl — методы изменения счёта (add_points, reset_score)
fn main() {
let mut input = String::new();
// Прочитать имя игрока
io::stdin().read_line(&mut input).expect("Failed to read line");
let name = input.trim().to_string();
// Прочитать очки первого раунда
input.clear();
io::stdin().read_line(&mut input).expect("Failed to read line");
let first_round: u32 = input.trim().parse().expect("Invalid number");
// Прочитать очки второго раунда
input.clear();
io::stdin().read_line(&mut input).expect("Failed to read line");
let second_round: u32 = input.trim().parse().expect("Invalid number");
// TODO: Создать игрока с помощью Player::new
// TODO: Добавить очки первого раунда и вывести счёт
// TODO: Сбросить счёт
// TODO: Добавить очки второго раунда и вывести итоговый счёт
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Методы и поведение
Введение в блоки реализацииПараметр SelfИзменяемые методыАссоциированные функцииНесколько блоков реализацииЦепочки вызовов методовИтоги: действия с Rectangle4Проект: Виртуальный питомец
Определение питомцаКормление питомца2Инкапсуляция и модули
Основы модулейКлючевое слово PublicПриватные поляГеттерыСеттерыИтоги — Безопасный сейф5Обобщения
Обобщённые структурыОбобщённые методыНесколько обобщённых типовОбобщённые функцииПовторение — Координатная точка8Трейты как ограничения
Синтаксис ограничений трейтовМножественные ограниченияКонструкция whereВозврат типов с трейтамиИтоги — Обобщённый принтер11Паттерны проектирования в Rust
Паттерн NewtypeКомпозицияТрейт DropFrom и IntoИтоги — Мок-объект Smart Pointer3Продвинутые перечисления
Перечисления с даннымиМетоды в перечисленияхСопоставление вариантов с даннымиСнова об Option EnumИтоги — перечисление Shape6Определение трейтов
Что такое трейт?Реализация трейтовРеализации по умолчаниюПереопределение реализаций по умолчаниюТрейты с параметрамиИтоги — Media PlayerПотренируйтесь самостоятельно: Онлайн-компилятор Rust