Assoziierte Funktionen
Teil des Abschnitts Objektorientierte Programmierung der Rust-Journey von Coddy. Lektion 4 von 61.
Nicht alle Funktionen in einem impl-Block müssen auf einer bestehenden Instanz operieren. Funktionen, die self nicht als Parameter übernehmen, werden als assoziierte Funktionen bezeichnet: Sie sind dem Typ selbst zugeordnet und nicht einer bestimmten Instanz.
Die häufigste Verwendung für zugeordnete Funktionen ist das Erstellen von Konstruktoren. Konventionell werden diese häufig new genannt:
struct Player {
name: String,
score: u32,
}
impl Player {
fn new(name: String) -> Player {
Player {
name,
score: 0,
}
}
}
Beachte, dass es keinen self-Parameter gibt. Diese Funktion benötigt keinen vorhandenen Player, um zu funktionieren. Stattdessen erstellt sie einen völlig neuen und gibt ihn zurück. Der Rückgabetyp ist die Struktur selbst.
Um eine zugehörige Funktion aufzurufen, verwende die Syntax :: mit dem Namen des Typs anstelle der Punktnotation:
fn main() {
let player1 = Player::new(String::from("Alice"));
println!("{} starts with {} points", player1.name, player1.score);
// Ausgabe: Alice beginnt mit 0 Punkten
}
Dieses Muster bietet eine übersichtliche Möglichkeit, Strukturen mit Standardwerten oder Validierungslogik zu initialisieren, wobei die Erstellungslogik mit der Typdefinition gebündelt bleibt. Du hast diese Syntax mit String::from() wahrscheinlich bereits gesehen: Das ist ebenfalls eine zugehörige Funktion!
Aufgabe
EinfachErstelle eine Book-Struktur mit zwei Feldern: title (String) und pages (u32).
Füge einen Implementierungsblock für Book mit einer zugehörigen Funktion namens new hinzu, die:
- einen
title: String-Parameter entgegennimmt - ein neues
Bookmit dem angegebenen Titel zurückgibt undpagesauf0setzt
Füge außerdem eine Methode namens info hinzu, die &self entgegennimmt und einen String im folgenden Format zurückgibt: "{title} has {pages} pages"
Du erhältst eine Eingabe:
- den Titel des Buches (String)
Verwende die zugehörige Funktion Book::new, um ein Buch mit dem angegebenen Titel zu erstellen, und gib anschließend das Ergebnis des Aufrufs der Methode info aus.
Erwartetes Ausgabeformat:
{title} has {pages} pagesProbier es selbst
use std::io;
// TODO: Definiere die Book-Struktur 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 title entgegennimmt und ein Book mit pages auf 0 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 Book mit dem angegebenen title 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 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