Menu
Coddy logo textTech

Özet - Generic Yazıcı

Coddy'nin Rust Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 44 / 61.

challenge icon

Görev

Kolay

Trait sınırlarının gücünü gösteren esnek bir duyuru sistemi oluşturalım! Bir Printable trait'i ve bu trait'i uygulayan herhangi bir türü duyurabilen genel bir işlev oluşturacaksınız: generic'lerin ve trait'lerin yeniden kullanılabilir, tür güvenli kod oluşturmak için nasıl birlikte çalıştığını göreceksiniz.

Kodunuzu iki dosya arasında düzenleyeceksiniz:

  • printable.rs: Printable alan ve print_info döndüren bir &self metoduna sahip public bir String trait'i tanımlayın. Ardından announce uygulayan herhangi bir T türünü kabul eden, Printable adlı public bir generic işlev oluşturun. Bu işlev, öğe üzerinde Announcement: {info} çağrısının sonucunun {info} olduğu print_info() ifadesini yazdırmalıdır.
  • main.rs: Printable uygulayan iki public struct oluşturun:
    • Person: public bir name alanına (String) sahip. print_info metodu Person: {name} döndürmelidir
    • Product: public name (String) ve price (f64) alanlarına sahip. print_info metodu Product: {name} - ${price} döndürmelidir
    Yazdırılabilir modülünüzü içeri aktarın, girdileri kullanarak bir Person ve bir Product oluşturun, ardından generic işlevinizin herhangi bir announce türüyle çalıştığını göstermek için her biriyle Printable işlevini çağırın.

Bu tasarımın güzelliği, announce işlevinin bir Person, Product veya gelecekteki herhangi bir tür alıp almadığını önemsememesidir. Yalnızca türün print_info() aracılığıyla bilgi sağlayabilmesini gerektirir. Trait sınırı bunu derleme zamanında garanti eder.

Çıktınız her iki duyuruyu da göstermelidir:

Announcement: Person: {name}
Announcement: Product: {product_name} - ${price}

Örneğin, Alice, Laptop ve 999.99 girdileriyle:

Announcement: Person: Alice
Announcement: Product: Laptop - $999.99

Üç girdi alacaksınız: kişinin adı, ürün adı ve ürün fiyatı (f64 olarak ayrıştırın).

Kendin dene

mod printable;

use printable::{Printable, announce};

// TODO: public name alanı (String) olan public bir struct Person tanımla
// Person için Printable trait'ini uygula
// print_info "Person: {name}" döndürmeli

// TODO: public name (String) ve price (f64) alanları olan public bir struct Product tanımla
// Product için Printable trait'ini uygula
// print_info "Product: {name} - ${price}" döndürmeli

fn main() {
    // Girdileri oku
    let mut person_name = String::new();
    std::io::stdin().read_line(&mut person_name).expect("Failed to read line");
    let person_name = person_name.trim().to_string();

    let mut product_name = String::new();
    std::io::stdin().read_line(&mut product_name).expect("Failed to read line");
    let product_name = product_name.trim().to_string();

    let mut price_input = String::new();
    std::io::stdin().read_line(&mut price_input).expect("Failed to read line");
    let price: f64 = price_input.trim().parse().expect("Failed to parse price");

    // TODO: person_name ile bir Person örneği oluştur

    // TODO: product_name ve price ile bir Product örneği oluştur

    // TODO: Person ile announce'ı çağır

    // TODO: Product ile announce'ı çağır
}

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online Rust derleyicisi