Der Self-Parameter
Teil des Abschnitts Objektorientierte Programmierung der Rust-Journey von Coddy. Lektion 2 von 61.
Wenn eine Methode auf die in einer Struct-Instanz gespeicherten Daten zugreifen muss, verwendet sie den Parameter &self. Dieser spezielle Parameter ist in einer Methode immer das erste Argument und stellt eine Referenz auf die Instanz dar, für die die Methode aufgerufen wird.
Das Symbol & bedeutet, dass wir uns die Instanz ausleihen, anstatt ihren Besitz zu übernehmen. Dadurch kann die Methode die Felder der Struktur lesen, ohne die Instanz zu verbrauchen:
struct Rectangle {
width: u32,
height: u32,
}
impl Rectangle {
fn area(&self) -> u32 {
self.width * self.height
}
fn is_square(&self) -> bool {
self.width == self.height
}
}
Im Methodenrumpf ermöglicht dir self den Zugriff auf alle Felder des struct mithilfe der Punktnotation. Die area-Methode liest sowohl width als auch height, um das Ergebnis zu berechnen und zurückzugeben.
Da &self die Instanz nur ausleiht, kannst du mehrere Methoden auf derselben Struktur problemlos aufrufen:
fn main() {
let rect = Rectangle { width: 10, height: 5 };
println!("Area: {}", rect.area()); // 50
println!("Square? {}", rect.is_square()); // false
}
Methoden mit &self sind schreibgeschützt. Sie können die Daten der Struktur untersuchen, aber sie nicht ändern. In der nächsten Lektion lernst du, wie du Methoden erstellst, die die Instanz ändern können.
Aufgabe
EinfachErstelle eine Circle-Struktur mit einem einzigen Feld: radius (f64).
Füge einen Implementierungsblock für Circle mit zwei Methoden hinzu, die &self verwenden:
circumference: gibt den Umfang alsf64zurück (Formel:2.0 * 3.14159 * radius)diameter: gibt den Durchmesser alsf64zurück (Formel:2.0 * radius)
Du erhältst eine Eingabe:
- Der Radius des Kreises (f64)
Erstelle eine Circle-Instanz mit dem angegebenen Radius und gib anschließend den Umfang und den Durchmesser in separaten Zeilen aus.
Erwartetes Ausgabeformat:
{circumference}
{diameter}Probier es selbst
use std::io;
// TODO: Definiere die Circle-Struktur hier
// TODO: Füge den Implementierungsblock für Circle mit den Methoden circumference und diameter hinzu
fn main() {
let mut input = String::new();
io::stdin().read_line(&mut input).expect("Failed to read line");
let radius: f64 = input.trim().parse().expect("Invalid number");
// TODO: Erstelle eine Circle-Instanz und gib circumference und diameter 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