Menu
Coddy logo textTech

Veri İçeren Enum'lar

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

Rust'taki temel enum'lar, Direction::North veya Status::Active gibi sabit bir varyant kümesine sahip bir tür tanımlamanıza olanak tanır. Ancak Rust enum'ları bundan çok daha güçlüdür. Her bir varyant kendi verisini taşıyabilir, bu da enum'ları gerçek dünya senaryolarını modellemek için inanılmaz derecede esnek kılar.

Farklı mesaj türlerinin farklı bilgiler taşıdığı bir mesajlaşma sistemi düşünün. Bir metin mesajının içeriği, bir hareket komutunun koordinatları vardır ve bir çıkış sinyalinin ise hiçbir şeyi yoktur. Rust'ta, tüm bunları tek bir enum ile temsil edebilirsiniz:

enum Message {
    Quit,
    Move { x: i32, y: i32 },
    Write(String),
    ChangeColor(u8, u8, u8),
}

Her varyantın farklı bir şekli vardır. Quit hiçbir veri tutmaz; sadece bir sinyaldir.

Move, isimlendirilmiş alanlara sahip struct benzeri bir sözdizimi kullanır. Write, demet (tuple) sözdizimini kullanarak tek bir String tutar. ChangeColor, RGB bileşenlerini temsil eden üç değer tutar.

Bu varyantların örneklerini oluşturmak şu şekilde görünür:

let m1 = Message::Quit;
let m2 = Message::Move { x: 10, y: 20 };
let m3 = Message::Write(String::from("Hello"));
let m4 = Message::ChangeColor(255, 128, 0);

Bu yaklaşımın güzelliği; m1, m2, m3 ve m4 öğelerinin hepsinin aynı türde olmasıdır: Message. Onları aynı koleksiyonda saklayabilir, aynı fonksiyona iletebilir veya tek bir fonksiyondan herhangi bir varyantı döndürebilirsiniz. Enum, her bir varyantın ihtiyaç duyduğu özel bilgileri korurken farklı veri şekillerini tek bir tür altında birleştirir.

challenge icon

Görev

Kolay

Farklı uyarı türlerini temsil etmek için veri içeren enum'ları kullanan bir bildirim sistemi oluşturalım. Her bildirim türü farklı bilgiler taşır; bazılarının mesajları, bazılarının sayısal değerleri vardır ve bazıları ise basit sinyallerdir.

Kodunuzu düzenlemek için iki dosya oluşturacaksınız:

  • notification.rs: Üç varyantı olan genel bir Notification enum'ı tanımlayın:
    • Alert — tek bir String mesajı tutar (tuple sözdizimi)
    • Reminder — isimlendirilmiş alanlar tutar: title (String) ve minutes (u32)
    • Dismiss — veri tutmaz, sadece bir sinyaldir
  • main.rs: Bildirim modülünüzü dahil edin ve her varyanttan birer örnek oluşturun. Ardından, her üç varyantın da aynı türde olduğunu ancak farklı veriler taşıdığını göstermek için her bildirim hakkındaki bilgileri yazdırın.

Yazdırırken, her bildirimi görüntülemek için hata ayıklama biçimlendirmesini ({:?}) kullanın. Enum'ınızın bu şekilde yazdırılabilmesi için Debug trait'ini türetmeniz (derive) gerekecektir.

Çıktınız, her biri kendi satırında olmak üzere üç bildirimi de göstermelidir:

Alert("{message}")
Reminder { title: "{title}", minutes: {minutes} }
Dismiss

Örneğin, "Server down" şeklinde bir uyarı mesajı, "Meeting" başlığına ve 30 dakikaya sahip bir hatırlatıcı ile çıktı şu şekilde olacaktır:

Alert("Server down")
Reminder { title: "Meeting", minutes: 30 }
Dismiss

Üç girdi alacaksınız: uyarı mesajı, hatırlatıcı başlığı ve hatırlatıcı dakikası.

Kendin dene

mod notification;

use notification::Notification;

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

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

    let mut minutes_input = String::new();
    std::io::stdin().read_line(&mut minutes_input).expect("Failed to read line");
    let reminder_minutes: u32 = minutes_input.trim().parse().expect("Failed to parse minutes");

    // TODO: alert_message kullanarak bir Alert bildirimi oluşturun

    // TODO: reminder_title ve reminder_minutes kullanarak bir Reminder bildirimi oluşturun

    // TODO: Bir Dismiss bildirimi oluşturun

    // TODO: Her bildirimi {:?} hata ayıklama (debug) biçimlendirmesini kullanarak yazdırın
    // Her bildirim kendi satırına yazdırılmalıdı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