Getter
Teil des Abschnitts Object Oriented Programming der Rust-Journey von Coddy — Lektion 11 von 61.
Mit privaten Feldern kann externer Code nicht direkt auf die Daten Ihres Structs zugreifen. Aber manchmal müssen Sie andere die Daten lesen lassen, ohne ihnen die Möglichkeit zu geben, sie zu ändern. Hier kommen Getter-Methoden ins Spiel.
Ein Getter ist einfach eine öffentliche Methode, die eine Referenz auf ein privates Feld zurückgibt:
// wallet.rs
pub struct Wallet {
balance: f64,
}
impl Wallet {
pub fn new(initial: f64) -> Wallet {
Wallet { balance: initial }
}
pub fn balance(&self) -> f64 {
self.balance
}
}
Die balance()-Methode nimmt &self (schreibgeschützter Zugriff) entgegen und gibt den Wert des privaten Feldes zurück. In Rust werden Getter normalerweise nach dem Feld selbst benannt – es ist kein get_-Präfix erforderlich.
Jetzt kann externer Code den Kontostand über die Methode lesen:
// main.rs
mod wallet;
use wallet::Wallet;
fn main() {
let w = Wallet::new(100.0);
println!("Balance: {}", w.balance()); // Funktioniert!
}
Für Felder, die Daten im Besitz (Owned Data) wie String enthalten, werden Sie oft eine Referenz zurückgeben, um unnötiges Kopieren zu vermeiden:
pub fn name(&self) -> &String {
&self.name
}
Getter ermöglichen Ihnen einen kontrollierten Lesezugriff, während das Feld selbst geschützt bleibt. Die Struct behält die Kontrolle über ihre Daten – externer Code kann sie zwar einsehen, aber nicht verändern.
Aufgabe
EinfachLassen Sie uns ein Benutzerprofilsystem erstellen, das zeigt, wie Getter-Methoden einen kontrollierten Lesezugriff auf private Daten ermöglichen.
Sie werden zwei Dateien erstellen, um Ihren Code zu organisieren:
profile.rs: Definieren Sie einUserProfile-Struct mit zwei privaten Feldern:username(String) undage(u32). Das Struct selbst sollte öffentlich sein, aber die Felder sollten privat bleiben. Implementieren Sie einen öffentlichennew-Konstruktor, der einen Benutzernamen und ein Alter entgegennimmt. Fügen Sie dann zwei Getter-Methoden hinzu:username— gibt eine Referenz auf den Benutzernamen zurück (&String)age— gibt den Alterswert zurück (u32)
main.rs: Binden Sie Ihr Profil-Modul ein, erstellen Sie einUserProfileund verwenden Sie die Getter-Methoden, um die Informationen des Benutzers auszugeben.
Denken Sie daran, dass Getter in Rust normalerweise nach dem Feld selbst benannt werden – ein get_-Präfix ist nicht erforderlich. Geben Sie für String-Felder eine Referenz zurück, um unnötiges Kopieren zu vermeiden.
Ihre Ausgabe sollte genau diesem Format entsprechen:
Username: {username}
Age: {age}Wenn Sie beispielsweise ein Profil mit dem Benutzernamen "alice" und dem Alter 25 erstellen, würde die Ausgabe wie folgt aussehen:
Username: alice
Age: 25Sie erhalten zwei Eingaben: den Benutzernamen und das Alter.
Spickzettel
Eine Getter-Methode ist eine öffentliche Methode, die schreibgeschützten Zugriff auf ein privates Feld ermöglicht.
Getter erlauben es externem Code, Daten einzusehen, ohne sie direkt ändern zu können:
pub struct Wallet {
balance: f64,
}
impl Wallet {
pub fn new(initial: f64) -> Wallet {
Wallet { balance: initial }
}
pub fn balance(&self) -> f64 {
self.balance
}
}
In Rust werden Getter nach dem Feld selbst benannt – ein get_ Präfix ist nicht erforderlich.
Für Felder, die eigene Daten wie String enthalten, geben Sie eine Referenz zurück, um unnötiges Kopieren zu vermeiden:
pub fn name(&self) -> &String {
&self.name
}
Verwendung einer Getter-Methode:
let w = Wallet::new(100.0);
println!("Balance: {}", w.balance());
Probier es selbst
mod profile;
use profile::UserProfile;
fn main() {
let mut input1 = String::new();
std::io::stdin().read_line(&mut input1).expect("Failed to read line");
let username = input1.trim().to_string();
let mut input2 = String::new();
std::io::stdin().read_line(&mut input2).expect("Failed to read line");
let age: u32 = input2.trim().parse().expect("Failed to parse age");
// TODO: Erstelle ein UserProfile mit dem Konstruktor
// TODO: Verwende die Getter-Methoden, um den Benutzernamen und das Alter auszugeben
// Format:
// Username: {username}
// Age: {age}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Object Oriented Programming
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