Veränderliche Methoden
Teil des Abschnitts Objektorientierte Programmierung der Rust-Journey von Coddy. Lektion 3 von 61.
Manchmal müssen Methoden mehr tun, als nur Daten zu lesen. Sie müssen sie ändern. Um Methoden zu erstellen, die die Felder einer Struktur ändern können, verwenden wir &mut self statt &self.
Das Schlüsselwort mut bezeichnet eine veränderbare Ausleihe und erteilt der Methode die Berechtigung, den internen Zustand der Instanz zu ändern:
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
}
}
Beachte, dass increment und decrement &mut self verwenden, weil sie value ändern, während get &self verwendet, da es die Daten nur liest.
Beim Aufrufen veränderlicher Methoden muss die Instanz selbst als veränderlich deklariert werden:
fn main() {
let mut counter = Counter { value: 0 };
counter.increment();
counter.increment();
println!("{}", counter.get()); // 2
counter.decrement();
println!("{}", counter.get()); // 1
}
Wenn du beim Erstellen der Instanz das Schlüsselwort mut vergisst, verhindert Rust, dass du irgendwelche &mut self-Methoden darauf aufrufst. Dadurch weißt du immer, wann sich deine Daten ändern könnten.
Aufgabe
EinfachErstelle eine BankAccount-Struktur mit einem einzigen Feld: balance (i32).
Füge einen Implementierungsblock für BankAccount mit drei Methoden hinzu:
deposit: übernimmt&mut selfund einenamount: i32und addiert den Betrag zum Kontostandwithdraw: übernimmt&mut selfund einenamount: i32und subtrahiert den Betrag vom Kontostandget_balance: übernimmt&selfund gibt den aktuellen Kontostand alsi32zurück
Du erhältst drei Eingaben:
- Erste Zeile: der anfängliche Kontostand (i32)
- Zweite Zeile: der Einzahlungsbetrag (i32)
- Dritte Zeile: der Auszahlungsbetrag (i32)
Erstelle eine veränderbare BankAccount-Instanz mit dem anfänglichen Kontostand, zahle anschließend den angegebenen Betrag ein, zahle den angegebenen Betrag aus und gib den endgültigen Kontostand aus.
Erwartetes Ausgabeformat:
{final_balance}Probier es selbst
use std::io;
// TODO: Definiere die BankAccount-Struktur hier
// TODO: Füge den Implementierungsblock für BankAccount mit den Methoden deposit, withdraw und get_balance hinzu
fn main() {
let mut input = String::new();
// Anfangssaldo einlesen
io::stdin().read_line(&mut input).expect("Failed to read line");
let initial_balance: i32 = input.trim().parse().expect("Invalid number");
input.clear();
// Einzahlungsbetrag einlesen
io::stdin().read_line(&mut input).expect("Failed to read line");
let deposit_amount: i32 = input.trim().parse().expect("Invalid number");
input.clear();
// Abhebungsbetrag einlesen
io::stdin().read_line(&mut input).expect("Failed to read line");
let withdraw_amount: i32 = input.trim().parse().expect("Invalid number");
// TODO: Erstelle eine veränderbare BankAccount-Instanz mit initial_balance
// TODO: Rufe deposit mit deposit_amount auf
// TODO: Rufe withdraw mit withdraw_amount auf
// TODO: Gib den endgültigen Kontostand mit get_balance aus
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Methoden und Verhalten
Einführung in ImplementierungsblöckeDer Self-ParameterVeränderliche MethodenAssoziierte FunktionenMehrere ImplementierungsblöckeMethod ChainingRückblick – Rechteck-Aktionen4Projekt: Virtuelles Haustier
Das Haustier definierenDas Haustier füttern7Standard-Traits
Das Debug-TraitDas Display-TraitClone und CopyGleichheits-TraitsZusammenfassung – Druckbarer Punkt10Projekt: Dokumentensystem
Das Draw-TraitText-Komponente2Kapselung und Module
Grundlagen der ModuleDas Public-SchlüsselwortPrivate FelderGetterSetterWiederholung – Sicherer Tresor5Generics
Generische StructsGenerische MethodenMehrere generische TypenGenerische FunktionenZusammenfassung - Koordinatenpunkt8Traits als Einschränkungen
Syntax für Trait BoundsMehrfache BoundsDie Where-KlauselTypen mit Traits zurückgebenRückblick – Generischer Drucker11Design Patterns in Rust
Newtype-PatternKompositionDas Drop-TraitFrom und IntoZusammenfassung – Smart Pointer Mock3Fortgeschrittene Enums
Enums mit DatenMethoden für EnumsMatching von DatenvariantenDas Option-Enum erneut betrachtetZusammenfassung – Shape-Enum6Definition von Traits
Was ist ein Trait?Traits implementierenStandardimplementierungenStandardimplementierungen überschreibenTraits mit ParameternZusammenfassung – Media PlayerÜbe selbstständig: Online-Rust-Compiler