Menu
Coddy logo textTech

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ć.

challenge icon

Wyzwanie

Łatwy

Utwórz strukturę BankAccount z jednym polem: balance (i32).

Dodaj blok implementacji dla BankAccount z trzema metodami:

  • deposit: przyjmuje &mut self i amount: i32, dodaje kwotę do salda
  • withdraw: przyjmuje &mut self i amount: i32, odejmuje kwotę od salda
  • get_balance: przyjmuje &self i zwraca bieżące saldo jako i32

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
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Rust online