Menu
Coddy logo textTech

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ść.

challenge icon

Wyzwanie

Łatwy

Zdefiniujmy 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 nazwie Summarizable z 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ść typu String”.
  • 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!"
    
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Rust online