Menu
Coddy logo textTech

Изменяемые методы

Часть раздела Объектно-ориентированное программирование путешествия по Rust на Coddy. Урок 3 из 61.

Иногда методы должны не только считывать данные. Им нужно изменять их. Чтобы создавать методы, которые могут изменять поля struct, мы используем &mut self вместо &self.

Ключевое слово mut указывает на изменяемое заимствование, предоставляя методу разрешение изменять внутреннее состояние instance:

struct Counter {
    value: i32,
}

impl Counter {
    fn increment(&mut self) {
        self.value += 1;
    }
    
    fn decrement(&mut self) {
        self.value -= 1;
    }
    
    fn get(&self) -> i32 {
        self.value
    }
}

Обратите внимание, что increment и decrement используют &mut self, поскольку они изменяют value, тогда как get использует &self, поскольку только считывает данные.

При вызове mutable методов сам instance должен быть объявлен как mutable:

fn main() {
    let mut counter = Counter { value: 0 };
    
    counter.increment();
    counter.increment();
    println!("{}", counter.get()); // 2
    
    counter.decrement();
    println!("{}", counter.get()); // 1
}

Если вы забудете ключевое слово mut при создании instance, Rust не позволит вам вызывать на нём какие-либо методы &mut self. Это гарантирует, что вы всегда будете знать, когда ваши данные могут измениться.

challenge icon

Задание

Легко

Создайте структуру BankAccount с единственным полем: balance (i32).

Добавьте блок реализации для BankAccount с тремя методами:

  • deposit: принимает &mut self и amount: i32, добавляет amount к balance
  • withdraw: принимает &mut self и amount: i32, вычитает amount из balance
  • get_balance: принимает &self и возвращает текущий balance как i32

Вы получите три входных значения:

  • Первая строка: начальный balance (i32)
  • Вторая строка: amount для deposit (i32)
  • Третья строка: amount для withdrawal (i32)

Создайте изменяемый экземпляр BankAccount с начальным balance, затем выполните deposit указанного amount, withdraw указанного amount и выведите final balance.

Ожидаемый формат вывода:

{final_balance}

Попробуйте сами

use std::io;

// TODO: Определите структуру BankAccount здесь


// TODO: Добавьте блок реализации для BankAccount с методами deposit, withdraw и get_balance


fn main() {
    let mut input = String::new();
    
    // Прочитать начальный баланс
    io::stdin().read_line(&mut input).expect("Failed to read line");
    let initial_balance: i32 = input.trim().parse().expect("Invalid number");
    
    input.clear();
    
    // Прочитать сумму депозита
    io::stdin().read_line(&mut input).expect("Failed to read line");
    let deposit_amount: i32 = input.trim().parse().expect("Invalid number");
    
    input.clear();
    
    // Прочитать сумму снятия
    io::stdin().read_line(&mut input).expect("Failed to read line");
    let withdraw_amount: i32 = input.trim().parse().expect("Invalid number");
    
    // TODO: Создайте изменяемый экземпляр BankAccount с initial_balance
    // TODO: Вызовите deposit с deposit_amount
    // TODO: Вызовите withdraw с withdraw_amount
    // TODO: Выведите итоговый баланс, используя get_balance
}
quiz iconПроверьте себя

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

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

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