Изменяемые методы
Часть раздела Объектно-ориентированное программирование путешествия по 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. Это гарантирует, что вы всегда будете знать, когда ваши данные могут измениться.
Задание
ЛегкоСоздайте структуру BankAccount с единственным полем: balance (i32).
Добавьте блок реализации для BankAccount с тремя методами:
deposit: принимает&mut selfиamount: i32, добавляет amount к balancewithdraw: принимает&mut selfиamount: i32, вычитает amount из balanceget_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
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Методы и поведение
Введение в блоки реализацииПараметр SelfИзменяемые методыАссоциированные функцииНесколько блоков реализацииЦепочки вызовов методовИтоги: действия с Rectangle4Проект: Виртуальный питомец
Определение питомцаКормление питомца2Инкапсуляция и модули
Основы модулейКлючевое слово PublicПриватные поляГеттерыСеттерыИтоги — Безопасный сейф5Обобщения
Обобщённые структурыОбобщённые методыНесколько обобщённых типовОбобщённые функцииПовторение — Координатная точка8Трейты как ограничения
Синтаксис ограничений трейтовМножественные ограниченияКонструкция whereВозврат типов с трейтамиИтоги — Обобщённый принтер11Паттерны проектирования в Rust
Паттерн NewtypeКомпозицияТрейт DropFrom и IntoИтоги — Мок-объект Smart Pointer3Продвинутые перечисления
Перечисления с даннымиМетоды в перечисленияхСопоставление вариантов с даннымиСнова об Option EnumИтоги — перечисление Shape6Определение трейтов
Что такое трейт?Реализация трейтовРеализации по умолчаниюПереопределение реализаций по умолчаниюТрейты с параметрамиИтоги — Media PlayerПотренируйтесь самостоятельно: Онлайн-компилятор Rust