Menu
Coddy logo textTech

Несколько блоков реализации

Часть раздела Объектно-ориентированное программирование путешествия по 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 для структуры не ограничено.

challenge icon

Задание

Легко

Создайте структуру Player с двумя полями: name (String) и score (u32).

Организуйте методы структуры в двух отдельных блоках реализации:

First impl block: Constructor и query:

  • new: ассоциированная функция, которая принимает name: String и возвращает Player с установленным значением score, равным 0
  • get_score: принимает &self и возвращает текущий score как u32

Second impl block: Изменения score:

  • add_points: принимает &mut self и points: u32, добавляет points к score
  • reset_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: Добавить очки второго раунда и вывести итоговый счёт
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор Rust