Menu
Coddy logo textTech

Trait Vektörleri

Coddy'nin Rust Journey'sinin Object Oriented Programming bölümünün bir parçası. Ders 46 / 61.

Box<dyn Trait> kullanarak tek bir değişkenin farklı türleri tutabilmesini gördün. Asıl güç, bunu koleksiyonlarla birleştirdiğinde ortaya çıkar: tek bir vektörde birden fazla farklı türü depolamak.

Normal bir vektördeki tüm öğelerin aynı türde olması gerekir. İçinde kediler de bulunan bir Vec<Dog> oluşturamazsınız. Ancak trait nesneleriyle, ortak bir trait'i uygulayan herhangi bir şeyi tutan bir vektör oluşturabilirsiniz:

trait Speak {
    fn speak(&self) -> String;
}

struct Dog;
struct Cat;
struct Bird;

impl Speak for Dog {
    fn speak(&self) -> String { String::from("Woof!") }
}

impl Speak for Cat {
    fn speak(&self) -> String { String::from("Meow!") }
}

impl Speak for Bird {
    fn speak(&self) -> String { String::from("Tweet!") }
}

fn main() {
    let animals: Vec<Box<dyn Speak>> = vec![
        Box::new(Dog),
        Box::new(Cat),
        Box::new(Bird),
    ];
}

Vec<Box<dyn Speak>> türü, "kutulanmış özellik nesnelerinden oluşan bir vektör" anlamına gelir. Her element, Speak özelliğini uygulayan bir şeye işaret eden bir Box'tır: gerçek türler farklı olabilir. Her değeri vektöre eklerken Box::new() ile sarmalarsın.

Bu kalıp; UI bileşenleri, oyun varlıkları veya eklenti sistemleri gibi birbiriyle ilişkili ancak farklı nesne koleksiyonlarını yönetmeniz gereken esnek sistemler oluşturmak için gereklidir.

challenge icon

Görev

Kolay

Farklı uyarı türlerini işleyebilen bir bildirim sistemi oluşturalım! Çeşitli bildirim türlerini, e-postaları, SMS mesajlarını ve push bildirimlerini tek bir vektörde trait nesnelerini kullanarak depolayan bir koleksiyon oluşturacaksın.

Kodunu iki dosyaya ayıracaksın:

  • notifications.rs: &self alan ve gönderilmekte olan bildirimi açıklayan bir String döndüren bir Notify trait'i ile send methodunu tanımla. Ardından üç public struct oluştur:
    • Email: public bir recipient alanına (String) sahip. send, Email to: {recipient} döndürmeli
    • Sms: public bir phone alanına (String) sahip. send, SMS to: {phone} döndürmeli
    • Push: public bir device alanına (String) sahip. send, Push to: {device} döndürmeli
  • main.rs: notifications modülünü içe aktar ve üç bildirim türünün tamamını tutan Vec<Box<dyn Notify>> türünde bir vektör oluştur. Sağlanan inputs değerlerini kullanarak her bildirim türünden bir tane oluştur, bunları vektörüne sırayla (Email, Sms, Push) ekle, ardından vektörün ilk öğesi üzerinde send() çağrısının result değerini yazdır.

Buradaki temel kavram, Email, Sms ve Push tamamen farklı struct'lar olmasına rağmen Notify trait'ini paylaştıkları için aynı vektörde birlikte bulunabilmeleridir. Her element, trait nesnesi oluşturmak için Box::new() ile sarılır.

Çıktın ilk bildirimi göstermeli:

Email to: {recipient}

Örneğin alice@example.com, 555-1234 ve iPhone-12 inputs değerleriyle:

Email to: alice@example.com

Üç input alacaksın: e-posta recipient'ı, telefon numarası ve device adı.

Kendin dene

mod notifications;

use notifications::{Notify, Email, Sms, Push};

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

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

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

    // TODO: Farklı bildirim türlerini tutmak için bir Vec<Box<dyn Notify>> oluştur
    // TODO: Girdileri kullanarak Email, Sms ve Push örnekleri oluştur
    // TODO: Bunları sırayla (Email, Sms, Push) vektöre Box::new() kullanarak ekle
    // TODO: İlk eleman üzerinde send() çağrısının sonucunu yazdır
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

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

Kendi başına pratik yap: Online Rust derleyicisi