Metody modyfikujące
Część sekcji Programowanie obiektowe ścieżki Rust w Coddy. Lekcja 3 z 61.
Czasami metody muszą robić coś więcej niż tylko odczytywać dane. Muszą je zmieniać. Aby utworzyć metody, które mogą modyfikować pola struktury, używamy &mut self zamiast &self.
Słowo kluczowe mut oznacza mutowalne pożyczenie, dając metodzie uprawnienie do zmiany wewnętrznego stanu instancji:
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
}
}
Zauważ, że increment i decrement używają &mut self, ponieważ modyfikują value, natomiast get używa &self, ponieważ tylko odczytuje dane.
Podczas wywoływania metod mutowalnych sama instancja musi być zadeklarowana jako mutowalna:
fn main() {
let mut counter = Counter { value: 0 };
counter.increment();
counter.increment();
println!("{}", counter.get()); // 2
counter.decrement();
println!("{}", counter.get()); // 1
}
Jeśli zapomnisz o słowie kluczowym mut podczas tworzenia instancji, Rust uniemożliwi wywoływanie na niej metod &mut self. Dzięki temu zawsze będziesz wiedzieć, kiedy Twoje dane mogą się zmienić.
Wyzwanie
ŁatwyUtwórz strukturę BankAccount z jednym polem: balance (i32).
Dodaj blok implementacji dla BankAccount z trzema metodami:
deposit: przyjmuje&mut selfiamount: i32, dodaje kwotę do saldawithdraw: przyjmuje&mut selfiamount: i32, odejmuje kwotę od saldaget_balance: przyjmuje&selfi zwraca bieżące saldo jakoi32
Otrzymasz trzy dane wejściowe:
- Pierwszy wiersz: saldo początkowe (i32)
- Drugi wiersz: kwota wpłaty (i32)
- Trzeci wiersz: kwota wypłaty (i32)
Utwórz mutowalną instancję BankAccount z saldem początkowym, następnie wpłać podaną kwotę, wypłać podaną kwotę i wypisz saldo końcowe.
Oczekiwany format wyjścia:
{final_balance}Spróbuj swoich sił
use std::io;
// TODO: Zdefiniuj tutaj strukturę BankAccount
// TODO: Dodaj blok implementacji dla BankAccount z metodami deposit, withdraw i get_balance
fn main() {
let mut input = String::new();
// Odczytaj saldo początkowe
io::stdin().read_line(&mut input).expect("Failed to read line");
let initial_balance: i32 = input.trim().parse().expect("Invalid number");
input.clear();
// Odczytaj kwotę wpłaty
io::stdin().read_line(&mut input).expect("Failed to read line");
let deposit_amount: i32 = input.trim().parse().expect("Invalid number");
input.clear();
// Odczytaj kwotę wypłaty
io::stdin().read_line(&mut input).expect("Failed to read line");
let withdraw_amount: i32 = input.trim().parse().expect("Invalid number");
// TODO: Utwórz mutowalną instancję BankAccount z initial_balance
// TODO: Wywołaj deposit z deposit_amount
// TODO: Wywołaj withdraw z withdraw_amount
// TODO: Wyświetl saldo końcowe za pomocą get_balance
}Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Metody i zachowanie
Wprowadzenie do bloków implementacjiParametr selfMetody modyfikująceFunkcje powiązaneWiele bloków implementacjiŁańcuchowe wywoływanie metodPowtórzenie — działania na prostokącie4Projekt: Wirtualne zwierzątko
Definiowanie zwierzątkaKarmienie zwierzątka7Standardowe cechy
Cecha DebugCecha DisplayClone i CopyCechy równościPowtórka – punkt do wydrukowania10Projekt: System dokumentów
Trait DrawKomponent tekstowy2Hermetyzacja i moduły
Podstawy modułówSłowo kluczowe publicPola prywatneGetterySetteryPodsumowanie — bezpieczna skrytka5Typy generyczne
Struktury generyczneMetody generyczneWiele typów generycznychFunkcje generycznePodsumowanie – punkt współrzędnych8Cechy jako ograniczenia
Składnia ograniczeń cechWiele ograniczeńKlauzula whereZwracanie typów z użyciem cechPodsumowanie — generyczna drukarka11Wzorce projektowe w Rust
Wzorzec NewtypeKompozycjaTrait DropFrom i IntoPodsumowanie — atrapowy inteligentny wskaźnik3Zaawansowane typy wyliczeniowe
Typy wyliczeniowe z danymiMetody typów wyliczeniowychDopasowywanie wariantów danychTyp wyliczeniowy Option — powtórzeniePodsumowanie — typ wyliczeniowy Shape6Definiowanie cech
Czym jest cecha?Implementowanie cechImplementacje domyślneNadpisywanie wartości domyślnychCechy z parametramiPowtórzenie — odtwarzacz multimedialnyPoćwicz samodzielnie: Kompilator Rust online