Direkt zum Hauptinhalt springen
eLearner.app
Modul 4 · Lektion 2 von 28/14 im Kurs~12 min
Lektionen des Moduls (2/2)

Methoden und impl-Blöcke

In Rust ähneln Methoden Funktionen, werden aber im Kontext einer Struct (oder eines Enums oder Traits) definiert, und ihr erster Parameter ist immer self, was die Instanz der Struct darstellt, auf der die Methode aufgerufen wird.

Methoden mit impl definieren

Um Methoden für eine Struct zu definieren, verwenden wir einen impl-Block (Implementation) mit dem Namen der Struct:

Code
struct Rectangle {
    width: u32,
    height: u32,
}

impl Rectangle {
    // Questo è un metodo d'istanza. Prende &self in lettura.
    fn area(&self) -> u32 {
        self.width * self.height
    }
}

fn main() {
    let rect = Rectangle { width: 30, height: 50 };

    // Chiamata al metodo tramite notazione con punto
    println!("L'area è: {}", rect.area());
}

Assoziierte Funktionen (Statische Methoden)

Funktionen, die in einem impl-Block definiert sind und self nicht als ersten Parameter akzeptieren, werden als assoziierte Funktionen bezeichnet (entspricht statischen Methoden in anderen Sprachen).

Sie werden oft als Konstruktoren verwendet, um neue Instanzen der Struct zurückzugeben. Zum Aufrufen wird die Syntax mit doppeltem Doppelpunkt :: verwendet:

Code
impl Rectangle {
    // Funzione associata
    fn square(size: u32) -> Rectangle {
        Rectangle {
            width: size,
            height: size,
        }
    }
}

fn main() {
    // Chiamata alla funzione associata
     let sq = Rectangle::square(10);
 }

Methoden, die den Zustand ändern: &mut self

Wenn eine Methode die Felder der Struct ändern muss, muss sie den ersten Parameter als &mut self deklarieren. Die Instanz selbst, auf der die Methode aufgerufen wird, muss als veränderlich deklariert werden (let mut):

Code
impl Rectangle {
    fn double_size(&mut self) {
        self.width *= 2;
        self.height *= 2;
    }
}

Probiere es aus

Übung#rust.m4.l2.e1
Versuche: 0Wird geladen…

Vervollständigen Sie den impl-Block, indem Sie die Methode area definieren, die &self annimmt und u32 zurückgibt (die Multiplikation von width und height).

Editor wird geladen…
Hinweis anzeigen

Schreiben Sie `fn area(&self) -> u32 { self.width \* self.height }`in den`impl Rectangle`-Block.

Lösung nach 3 Versuchen verfügbar

Übung#rust.m4.l2.e2
Versuche: 0Wird geladen…

Definieren Sie die assoziierte Funktion square innerhalb von impl Rectangle, die size: u32 erhält und eine Rectangle-Instanz zurückgibt, deren Breite und Höhe gleich size sind.

Editor wird geladen…
Hinweis anzeigen

Schreiben Sie `fn square(size: u32) -> Rectangle { Rectangle { width: size, height: size } }`in den`impl`-Block.

Lösung nach 3 Versuchen verfügbar

Übung#rust.m4.l2.e3
Versuche: 0Wird geladen…

Fügen Sie Rectangle die verändernde Methode scale innerhalb des impl-Blocks hinzu. Die Methode scale muss eine veränderliche Referenz auf self (&mut self) und einen Parameter factor: u32 annehmen und sowohl width als auch height von Rectangle mit factor multiplizieren.

Editor wird geladen…
Hinweis anzeigen

Implementieren Sie `fn scale(&mut self, factor: u32)`, um `self.width`und`self.height`durch Multiplikation mit`factor` zu aktualisieren.

Lösung nach 3 Versuchen verfügbar