Wprowadzenie do bloków implementacji
Część sekcji Programowanie obiektowe ścieżki Rust w Coddy. Lekcja 1 z 61.
W Rust struktury określają, jakie dane przechowuje dany typ, ale nie określają, co ten typ potrafi robić. Aby nadać strukturze zachowanie, używamy bloków implementacji ze słowem kluczowym impl.
Blok implementacji łączy funkcje (nazywane metodami) z konkretną strukturą. Oto podstawowa struktura:
struct Dog {
name: String,
age: u8,
}
impl Dog {
fn bark(&self) {
println!("{} says woof!", self.name);
}
}
Blok impl Dog informuje Rust, że wszystko, co znajduje się w środku, należy do struktury Dog. Taki podział pozwala zachować przejrzystość definicji danych, a jednocześnie dodawać dowolną liczbę metod w bloku implementacji.
Aby wywołać metodę, użyj notacji kropkowej na instancji:
fn main() {
let my_dog = Dog {
name: String::from("Rex"),
age: 3,
};
my_dog.bark(); // Wynik: Rex mówi hau!
}
Ten wzorzec oddzielania danych (struktury) od zachowania (bloku impl) ma fundamentalne znaczenie dla organizacji kodu Rust. W kolejnych lekcjach przyjrzymy się temu, jak metody uzyskują dostęp do danych struktury za pomocą parametru &self, który widzisz w powyższym przykładzie.
Wyzwanie
ŁatwyUtwórz strukturę Cat z dwoma polami: name (String) i lives (u8).
Dodaj blok implementacji dla Cat z metodą o nazwie meow, która przyjmuje &self i wypisuje imię kota, a po nim " says meow!".
Otrzymasz dwa wejścia:
- Pierwsza linia: imię kota (String)
- Druga linia: liczba żyć (u8)
Utwórz instancję Cat z podanymi wartościami i wywołaj na niej metodę meow.
Oczekiwany format wyjścia:
{name} says meow!Spróbuj swoich sił
use std::io;
// TODO: Zdefiniuj strukturę Cat z polami 'name' (String) i 'lives' (u8)
// TODO: Dodaj blok implementacji dla Cat z metodą 'meow'
fn main() {
let mut name = String::new();
io::stdin().read_line(&mut name).expect("Failed to read line");
let name = name.trim().to_string();
let mut lives_input = String::new();
io::stdin().read_line(&mut lives_input).expect("Failed to read line");
let lives: u8 = lives_input.trim().parse().expect("Failed to parse lives");
// TODO: Utwórz instancję Cat i wywołaj metodę meow
}Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Metody i zachowanie
Wprowadzenie do bloków implementacjiParametr selfMetody modyfikująceFunkcje powiązaneWiele bloków implementacjiŁańcuchowe wywoływanie metodPowtórzenie — działania na prostokącie4Projekt: Wirtualne zwierzątko
Definiowanie zwierzątkaKarmienie zwierzątka7Standardowe cechy
Cecha DebugCecha DisplayClone i CopyCechy równościPowtórka – punkt do wydrukowania10Projekt: System dokumentów
Trait DrawKomponent tekstowy2Hermetyzacja i moduły
Podstawy modułówSłowo kluczowe publicPola prywatneGetterySetteryPodsumowanie — bezpieczna skrytka5Typy generyczne
Struktury generyczneMetody generyczneWiele typów generycznychFunkcje generycznePodsumowanie – punkt współrzędnych8Cechy jako ograniczenia
Składnia ograniczeń cechWiele ograniczeńKlauzula whereZwracanie typów z użyciem cechPodsumowanie — generyczna drukarka11Wzorce projektowe w Rust
Wzorzec NewtypeKompozycjaTrait DropFrom i IntoPodsumowanie — atrapowy inteligentny wskaźnik3Zaawansowane typy wyliczeniowe
Typy wyliczeniowe z danymiMetody typów wyliczeniowychDopasowywanie wariantów danychTyp wyliczeniowy Option — powtórzeniePodsumowanie — typ wyliczeniowy Shape6Definiowanie cech
Czym jest cecha?Implementowanie cechImplementacje domyślneNadpisywanie wartości domyślnychCechy z parametramiPowtórzenie — odtwarzacz multimedialnyPoćwicz samodzielnie: Kompilator Rust online