Menu
Coddy logo textTech

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.

challenge icon

Wyzwanie

Łatwy

Oż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ę Describable z metodą describe(&self) -> String.
  • items.rs: Utwórz dwie publiczne struktury implementujące tę cechę:
    • Book z publicznym polem title (String)
    • Movie z publicznym polem name (String)
    Każda struktura powinna implementować cechę Describable we własnym, unikalnym formacie opisu.
  • main.rs: Połącz swoje moduły, utwórz instancje obu struktur i wywołaj ich metody describe, 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: Inception

Otrzymasz 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
}
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