Implementowanie cech
Część sekcji Programowanie obiektowe ścieżki Rust w Coddy. Lekcja 30 z 61.
Skoro wiesz już, jak zdefiniować cechę, zobaczmy, jak sprawić, by struktura spełniała jej wymagania. Implementacja cechy łączy abstrakcyjne wymagania z konkretnym zachowaniem.
Składnia używa impl TraitName for StructName:
trait Speak {
fn speak(&self) -> String;
}
struct Dog {
name: String,
}
impl Speak for Dog {
fn speak(&self) -> String {
format!("{} says: Woof!", self.name)
}
}
Blok impl Speak for Dog informuje Rust, że Dog implementuje cechę Speak. Wewnątrz podajesz właściwe ciało metody. To tutaj definiujesz, jak mówi pies.
Potęga cech staje się oczywista, gdy ten sam trait implementuje wiele typów:
struct Cat {
name: String,
}
impl Speak for Cat {
fn speak(&self) -> String {
format!("{} says: Meow!", self.name)
}
}
Zarówno Dog, jak i Cat mają teraz wspólną umiejętność Speak, ale każda z nich ma własną, unikalną implementację. Możesz wywołać .speak() dla dowolnego z tych typów:
let dog = Dog { name: String::from("Rex") };
let cat = Cat { name: String::from("Whiskers") };
println!("{}", dog.speak()); // Rex mówi: Hau!
println!("{}", cat.speak()); // Whiskers mówi: Miau!
To podstawa polimorfizmu w Rust: różne typy, ten sam interfejs, unikalne zachowania.
Wyzwanie
ŁatwyOżywmy cechy, implementując je dla różnych typów! Utworzysz cechę Describable i zaimplementujesz ją dla dwóch różnych struktur, z których każda będzie dostarczać własny, unikalny opis.
Rozmieścisz swój kod w trzech plikach:
describable.rs: Zdefiniuj publiczną cechęDescribablez metodądescribe(&self) -> String.items.rs: Utwórz dwie publiczne struktury implementujące tę cechę:Bookz publicznym polemtitle(String)Moviez publicznym polemname(String)
Describablewe własnym, unikalnym formacie opisu.main.rs: Połącz swoje moduły, utwórz instancje obu struktur i wywołaj ich metodydescribe, aby pokazać, jak ta sama cecha daje różne wyniki dla różnych typów.
Struktura Book powinna opisywać się jako Book: {title}, a struktura Movie jako Film: {name}. Zwróć uwagę, że każdy typ spełnia ten sam kontrakt, ale zachowuje się na swój własny sposób!
W pliku głównym utwórz książkę i film, używając dwóch podanych danych wejściowych, a następnie wypisz ich opisy w osobnych wierszach.
Wynik powinien mieć następujący format:
Book: {title}
Film: {name}Na przykład dla danych wejściowych 1984 i Inception:
Book: 1984
Film: InceptionOtrzymasz dwa dane wejściowe: tytuł książki i nazwę filmu.
Spróbuj swoich sił
mod describable;
mod items;
use describable::Describable;
use items::{Book, Movie};
fn main() {
// Wczytaj dane wejściowe
let mut title = String::new();
std::io::stdin().read_line(&mut title).expect("Failed to read line");
let title = title.trim().to_string();
let mut name = String::new();
std::io::stdin().read_line(&mut name).expect("Failed to read line");
let name = name.trim().to_string();
// TODO: Utwórz instancję Book z tytułem
// TODO: Utwórz instancję Movie z nazwą
// TODO: Wypisz opis książki
// TODO: Wypisz opis filmu
}
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