Menu
Coddy logo textTech

Assoziierte Funktionen

Teil des Abschnitts Object Oriented Programming der Rust-Journey von Coddy — Lektion 4 von 61.

Nicht alle Funktionen in einem impl-Block müssen auf einer existierenden Instanz operieren. Funktionen, die self nicht als Parameter entgegennehmen, werden assoziierte Funktionen genannt—sie sind mit dem Typ selbst assoziiert und nicht mit einer bestimmten Instanz.

Die häufigste Verwendung für assoziierte Funktionen ist das Erstellen von Konstruktoren. Konventionsgemäß werden diese oft new genannt:

struct Player {
    name: String,
    score: u32,
}

impl Player {
    fn new(name: String) -> Player {
        Player {
            name,
            score: 0,
        }
    }
}

Beachten Sie, dass es keinen self-Parameter gibt – diese Funktion benötigt keinen existierenden Player, um zu funktionieren. Stattdessen erstellt und gibt sie einen brandneuen zurück. Der Rückgabetyp ist das Struct selbst.

Um eine assoziierte Funktion aufzurufen, verwende die ::-Syntax mit dem Typnamen anstelle der Punktnotation:

fn main() {
    let player1 = Player::new(String::from("Alice"));
    
    println!("{} starts with {} points", player1.name, player1.score);
    // Ausgabe: Alice startet mit 0 Punkten
}

Dieses Muster bietet eine saubere Möglichkeit, Structs mit Standardwerten oder Validierungslogik zu initialisieren, wobei die Erstellungslogik direkt bei der Typdefinition gebündelt bleibt. Sie haben diese Syntax wahrscheinlich schon bei String::from() gesehen – das ist ebenfalls eine assoziierte Funktion!

challenge icon

Aufgabe

Einfach

Erstellen Sie eine Book-Struktur mit zwei Feldern: title (String) und pages (u32).

Fügen Sie einen Implementierungsblock für Book mit einer assoziierten Funktion namens new hinzu, die:

  • Einen Parameter title: String entgegennimmt
  • Ein neues Book mit dem angegebenen Titel und pages gesetzt auf 0 zurückgibt

Fügen Sie außerdem eine Methode namens info hinzu, die &self entgegennimmt und einen String im Format "{title} has {pages} pages" zurückgibt.

Sie erhalten eine Eingabe:

  • Den Titel des Buches (String)

Verwenden Sie die assoziierte Funktion Book::new, um ein Buch mit dem angegebenen Titel zu erstellen, und geben Sie dann das Ergebnis des Aufrufs der Methode info aus.

Erwartetes Ausgabeformat:

{title} has {pages} pages

Spickzettel

Funktionen in einem impl-Block, die self nicht als Parameter entgegennehmen, werden assoziierte Funktionen genannt. Sie sind mit dem Typ selbst verknüpft und nicht mit einer bestimmten Instanz.

Assoziierte Funktionen werden häufig als Konstruktoren verwendet, die typischerweise new genannt werden:

struct Player {
    name: String,
    score: u32,
}

impl Player {
    fn new(name: String) -> Player {
        Player {
            name,
            score: 0,
        }
    }
}

Um eine assoziierte Funktion aufzurufen, verwende die ::-Syntax mit dem Typnamen:

let player1 = Player::new(String::from("Alice"));

String::from() ist ein Beispiel für eine assoziierte Funktion, die du bereits verwendet hast.

Probier es selbst

use std::io;

// TODO: Definiere das Book-Struct mit den Feldern title (String) und pages (u32)


// TODO: Füge einen impl-Block für Book hinzu mit:
// - Einer assoziierten Funktion `new`, die einen Titel entgegennimmt und ein Book mit 0 Seiten zurückgibt
// - Einer Methode `info`, die einen String im Format "{title} has {pages} pages" zurückgibt


fn main() {
    let mut input = String::new();
    io::stdin().read_line(&mut input).expect("Failed to read line");
    let title = input.trim().to_string();

    // TODO: Verwende Book::new, um ein Buch mit dem angegebenen Titel zu erstellen
    // TODO: Gib das Ergebnis des Aufrufs der info-Methode aus
}
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