Menu
Coddy logo textTech

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.

challenge icon

Aufgabe

Einfach

Lassen 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 ein UserProfile-Struct mit zwei privaten Feldern: username (String) und age (u32). Das Struct selbst sollte öffentlich sein, aber die Felder sollten privat bleiben. Implementieren Sie einen öffentlichen new-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 ein UserProfile und 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: 25

Sie 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}
}
quiz iconTeste dich selbst

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