CodeBlanks Logo Icon CodeBlanks

Veri taşıyan variantlar

Veri taşıyan enum variantları tanımlarsın.

Veri taşıyan variant'lar

Rust enum'larının asıl gücü, her variant'ın farklı veri taşıyabilmesidir:

enum Mesaj {
    Cik,                       // veri yok
    Tasi { x: i32, y: i32 },   // struct biçimi
    Yaz(String),               // tuple biçimi
    Renk(u8, u8, u8),
}

let m = Mesaj::Tasi { x: 3, y: -1 };

Bunun yerine dört ayrı struct yazsaydık, onları tek bir türde toplayıp aynı fonksiyona vermek zor olurdu. Enum hepsini tek türde birleştirir.

Veriyi açmak

match kollarında variant'ın verisi değişkenlere bağlanır:

fn anlat(m: &Mesaj) -> String {
    match m {
        Mesaj::Cik => String::from("çıkış"),
        Mesaj::Tasi { x, y } => format!("taşı {x},{y}"),
        Mesaj::Yaz(metin) => format!("yaz: {metin}"),
        Mesaj::Renk(r, g, b) => format!("renk {r}/{g}/{b}"),
    }
}

&Mesaj üzerinde eşleştirince bağlanan değişkenler de referans olur; sahiplik taşınmaz.

Uygulama Mesajları anlat

Yukarıdaki Mesaj enum'ını ve fn anlat(m: &Mesaj) -> String fonksiyonunu yaz. Cik, Tasi { x: 3, y: -1 }, Yaz("selam") ve Renk(0, 128, 255) içeren bir vektörü dolaşıp her birini ayrı satıra yazdır.

Başlangıç kodu

main.rs
fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
enum Mesaj {
    Cik,
    Tasi { x: i32, y: i32 },
    Yaz(String),
    Renk(u8, u8, u8),
}

fn anlat(m: &Mesaj) -> String {
    match m {
        Mesaj::Cik => String::from("çıkış"),
        Mesaj::Tasi { x, y } => format!("taşı {x},{y}"),
        Mesaj::Yaz(metin) => format!("yaz: {metin}"),
        Mesaj::Renk(r, g, b) => format!("renk {r}/{g}/{b}"),
    }
}

fn main() {
    let mesajlar = vec![
        Mesaj::Cik,
        Mesaj::Tasi { x: 3, y: -1 },
        Mesaj::Yaz(String::from("selam")),
        Mesaj::Renk(0, 128, 255),
    ];
    for m in &mesajlar {
        println!("{}", anlat(m));
    }
}

Beklenen çıktı

çıkış
taşı 3,-1
yaz: selam
renk 0/128/255

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 <code>Mesaj::Yaz(String::from("a"))</code> içindeki metne nasıl ulaşılır?

  • m.0 ile
  • m.Yaz ile
  • as String ile
  • match ya da if let ile kalıp eşleştirerek Doğru cevap

Açıklama: Variant verisi yalnızca kalıp eşleştirme ile güvenle açılır; derleyici variant'ın gerçekten Yaz olduğunu bilmek ister.

2 Struct variant'ı

Soru
let m = Mesaj::Tasi ____;
Cevap
let m = Mesaj::Tasi { x: 3, y: -1 };

Açıklama: Struct biçimli variant süslü parantez ve alan adlarıyla oluşturulur.

3 Variant ve biçimi

Kavram Anlamı
Cik Verisiz
Tasi { x, y } Struct biçimi
Yaz(String) Tuple biçimi, tek alan
Renk(u8, u8, u8) Tuple biçimi, üç alan

Başlangıç bölümündeki tüm dersler

16 Proje: Yapılacaklar listesi

  1. Görev modeli
  2. Ekleme
  3. Listeleme
  4. İşaretleme
  5. Komut okuma