Veri taşıyan variantlar
- Rust kursu
- Başlangıç
- Ders 79/115
- 4 dk
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
fn main() {
// buraya yaz
}Örnek çözüm
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'ı
let m = Mesaj::Tasi ____;
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 |