Menu
Coddy logo textTech

Özet - Generic Yazıcı

Coddy'nin Rust Journey'sinin Object Oriented Programming 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 inşa edelim! Bir Printable traiti ve bu traiti uygulayan herhangi bir türü duyurabilen genel (generic) bir fonksiyon oluşturacaksınız; böylece generic'lerin ve trait'lerin yeniden kullanılabilir, tip güvenli kod oluşturmak için nasıl birlikte çalıştığını göreceksiniz.

Kodunuzu iki dosya halinde düzenleyeceksiniz:

  • printable.rs: &self alan ve bir String döndüren print_info metoduna sahip, genel kullanıma açık (public) bir Printable traiti tanımlayın. Ardından, Printable traitini uygulayan herhangi bir T türünü kabul eden announce adında genel kullanıma açık bir generic fonksiyon oluşturun. Bu fonksiyon, {info} öğenin print_info() metodunun çağrılmasından gelen sonuç olmak üzere, "Announcement: {info}" çıktısını yazdırmalıdır.
  • main.rs: Printable traitini uygulayan iki adet 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.
    printable modülünüzü dahil edin, girdileri kullanarak bir Person ve bir Product oluşturun, ardından generic fonksiyonunuzun herhangi bir Printable türüyle çalıştığını kanıtlamak için her biriyle announce fonksiyonunu çağırın.

Bu tasarımın güzelliği, announce fonksiyonunun bir Person mı, Product mı yoksa gelecekteki başka bir tür mü aldığıyla ilgilenmemesidir; yalnızca türün print_info() aracılığıyla bilgi sağlayabilmesini gerektirir. Trait sınırı (trait bound), 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: Genel (public) bir name alanına (String) sahip genel bir Person yapısı (struct) tanımlayın
// Person için Printable trait'ini uygulayın
// print_info "Person: {name}" döndürmelidir

// TODO: Genel name (String) ve price (f64) alanlarına sahip genel bir Product yapısı (struct) tanımlayın
// Product için Printable trait'ini uygulayın
// print_info "Product: {name} - ${price}" döndürmelidir

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şturun

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

    // TODO: Person ile announce fonksiyonunu çağırın

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

Object Oriented Programming bölümündeki tüm dersler