Przejdź do głównej treści
eLearner.app
Moduł 4 · Lekcja 2 z 28/14 w kursie~12 min
Lekcje modułu (2/2)

Metody i bloki impl

W języku Rust metody są podobne do funkcji, ale są definiowane w kontekście struktury (lub typu wyliczeniowego czy cechy - trait), a ich pierwszym parametrem jest zawsze self, który reprezentuje instancję struktury, na której metoda jest wywoływana.

Definiowanie metod za pomocą impl

Aby zdefiniować metody dla struktury, używamy bloku impl (implementation) z nazwą struktury:

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());
}

Funkcje powiązane (statyczne)

Funkcje zdefiniowane w bloku impl, które nie przyjmują self jako pierwszego parametru, są nazywane funkcjami powiązanymi (associated functions) (odpowiednikami metod statycznych w innych językach).

Często są używane jako konstruktory zwracające nowe instancje struktury. Do ich wywołania używa się składni z podwójnym dwukropkiem :::

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);
 }

Metody modyfikujące stan: &mut self

Jeśli metoda musi zmodyfikować pola struktury, musi zadeklarować swój pierwszy parametr jako &mut self. Sama instancja, na której wywoływana jest metoda, musi być zadeklarowana jako modyfikowalna (let mut):

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

Spróbuj sam

Ćwiczenie#rust.m4.l2.e1
Próby: 0Ładowanie...

Uzupełnij blok impl, definiując metodę area, która przyjmuje &self i zwraca u32 (iloczyn width i height).

Ładowanie edytora...
Pokaż wskazówkę

Zapisz `fn area(&self) -> u32 { self.width \* self.height }`wewnątrz bloku`impl Rectangle`.

Rozwiązanie dostępne po 3 próbach

Ćwiczenie#rust.m4.l2.e2
Próby: 0Ładowanie...

Zdefiniuj funkcję powiązaną square wewnątrz impl Rectangle, która pobiera size: u32 i zwraca instancję Rectangle o szerokości i wysokości równej size.

Ładowanie edytora...
Pokaż wskazówkę

Zapisz `fn square(size: u32) -> Rectangle { Rectangle { width: size, height: size } }`wewnątrz bloku`impl`.

Rozwiązanie dostępne po 3 próbach

Ćwiczenie#rust.m4.l2.e3
Próby: 0Ładowanie...

Dodaj metodę modyfikującą scale do struktury Rectangle wewnątrz bloku impl. Metoda scale musi przyjmować zmienną referencję do self (&mut self) oraz parametr factor: u32, i mnożyć zarówno width jak i height struktury Rectangle przez factor.

Ładowanie edytora...
Pokaż wskazówkę

Zaimplementuj `fn scale(&mut self, factor: u32)`w celu zaktualizowania`self.width`i`self.height`poprzez pomnożenie ich przez`factor`.

Rozwiązanie dostępne po 3 próbach