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!
Aufgabe
EinfachErstellen 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: Stringentgegennimmt - Ein neues
Bookmit dem angegebenen Titel undpagesgesetzt auf0zurü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} pagesSpickzettel
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
}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