Czym jest cecha?
Część sekcji Programowanie obiektowe ścieżki Rust w Coddy. Lekcja 29 z 61.
Typy generyczne pozwalają pisać kod działający z dowolnym typem, ale czasami trzeba zagwarantować, że typ potrafi robić coś konkretnego. Właśnie do tego służą cechy.
Cecha definiuje zestaw metod, które dany typ musi zaimplementować. Pomyśl o niej jak o umowie: każdy typ, który „podpisuje” tę umowę, zobowiązuje się zapewnić określone zachowanie. Jeśli korzystasz z interfejsów w innych językach, cechy pełnią podobną funkcję.
Oto jak definiujesz cechę:
trait Describable {
fn describe(&self) -> String;
}
Słowo kluczowe trait wprowadza cechę, po którym podaje się jej nazwę. W nawiasach klamrowych deklarujesz sygnatury metod: tylko nazwę, parametry i typ zwracany, bez treści. Średnik po sygnaturze oznacza, że jest to wymaganie, a nie implementacja.
Cecha Describable mówi: „Każdy typ, który ją implementuje, musi udostępniać metodę describe, która przyjmuje referencję do samego siebie i zwraca String”. Cecha nie określa, jak działa ta metoda — zależy to od każdego typu, który ją implementuje.
Cechy stają się potężne, gdy wiele różnych typów implementuje tę samą cechę. Book, Car i Person mogą wszystkie implementować Describable, a każdy z nich zapewnia własny, unikalny opis. Cecha gwarantuje, że wszystkie mają tę wspólną możliwość.
Wyzwanie
ŁatwyZdefiniujmy Twoją pierwszą cechę! Cecha ustanawia kontrakt: obietnicę, że każdy typ, który ją implementuje, zapewni określone zachowanie. Utworzysz cechę Summarizable, którą różne typy będą mogły implementować, aby udostępniać podsumowanie samych siebie.
Rozmieścisz swój kod w dwóch plikach:
summary.rs: Zdefiniuj publiczną cechę o nazwieSummarizablez jedną sygnaturą metody:summarize(&self) -> String. Pamiętaj, że w definicji cechy deklarujesz tylko sygnaturę metody zakończoną średnikiem — bez treści. Dzięki temu Rust wie, że „każdy typ implementujący tę cechę musi udostępniać metodęsummarize, która zwraca wartość typuString”.main.rs: Dołącz moduł summary i wyświetl komunikat potwierdzający, że Twoja cecha została zdefiniowana. Ponieważ nie poznaliśmy jeszcze sposobu implementowania cech (to temat następnej lekcji!), po prostu sprawdzisz, czy Twoja cecha kompiluje się poprawnie.
W pliku głównym wyświetl następujący komunikat, aby potwierdzić, że definicja Twojej cechy jest prawidłowa:
Summarizable trait defined successfully!To wyzwanie dotyczy wyłącznie składni definicji cechy: słowa kluczowego trait, nazwy cechy oraz deklarowania sygnatur metod bez ich implementacji. W następnej lekcji dowiesz się, jak sprawić, by struktury implementowały tę cechę!
Spróbuj swoich sił
mod summary;
fn main() {
// TODO: Wypisz komunikat potwierdzający, że trait został zdefiniowany
// Oczekiwane wyjście: "Summarizable trait defined successfully!"
}
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