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:
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 :::
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):
impl Rectangle {
fn double_size(&mut self) {
self.width *= 2;
self.height *= 2;
}
}
Spróbuj sam
Uzupełnij blok impl, definiując metodę area, która przyjmuje &self i zwraca u32 (iloczyn width i height).
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
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.
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
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.
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