Der Self-Parameter
Teil des Abschnitts Object Oriented Programming 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 immer das erste Argument in einer Methode und stellt eine Referenz auf die Instanz dar, für die die Methode aufgerufen wird.
Das &-Symbol bedeutet, dass wir die Instanz ausleihen (borrowing), anstatt das Eigentum (ownership) daran zu übernehmen. Dies ermöglicht es der Methode, die Felder des Structs zu 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
}
}
Innerhalb des Methodenkörpers ermöglicht Ihnen self den Zugriff auf alle Felder des Structs mithilfe der Punktnotation. Die Methode area liest sowohl width als auch height, um das Ergebnis zu berechnen und zurückzugeben.
Da &self die Instanz nur ausleiht, können Sie problemlos mehrere Methoden auf derselben Struktur aufrufen:
fn main() {
let rect = Rectangle { width: 10, height: 5 };
println!("Area: {}", rect.area()); // 50
println!("Square? {}", rect.is_square()); // falsch
}
Methoden, die &self verwenden, sind schreibgeschützt – sie können die Daten des Structs untersuchen, aber nicht ändern. In der nächsten Lektion wirst du lernen, wie man Methoden erstellt, die die Instanz verändern können.
Aufgabe
EinfachErstellen Sie eine Circle-Struktur mit einem einzigen Feld: radius (f64).
Fügen Sie 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)
Sie erhalten eine Eingabe:
- Der Radius des Kreises (f64)
Erstellen Sie eine Circle-Instanz mit dem angegebenen Radius und geben Sie dann den Umfang und den Durchmesser in separaten Zeilen aus.
Erwartetes Ausgabeformat:
{circumference}
{diameter}Spickzettel
Methoden greifen auf Struct-Daten über den Parameter &self zu, der das erste Argument sein muss. Das Symbol & bedeutet, dass die Methode die Instanz ausleiht, anstatt den Besitz zu übernehmen:
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
}
}
Verwenden Sie innerhalb der Methode self mit der Punktnotation, um auf Struct-Felder zuzugreifen. Methoden mit &self sind schreibgeschützt und können Daten untersuchen, aber nicht ändern.
Da &self die Instanz nur ausleiht, können Sie mehrere Methoden für denselben Struct aufrufen:
let rect = Rectangle { width: 10, height: 5 };
println!("Area: {}", rect.area()); // 50
println!("Square? {}", rect.is_square()); // false
Probier es selbst
use std::io;
// TODO: Definiere hier das Circle-Struct
// 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 den Umfang (circumference) und den Durchmesser (diameter) 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