Menu
Coddy logo textTech

Veri İçeren Enum'lar

Coddy'nin Rust Journey'sinin Nesne Yönelimli Programlama 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ızı sağlar. Ancak Rust enum'ları bundan çok daha güçlüdür. Her varyant kendi verisini taşıyabilir; bu da enum'ları gerçek dünyadaki senaryoları modellemek için son derece esnek hâle getirir.

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; çıkış sinyali ise hiçbir şey içermez. Rust'ta bunların tümünü 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 veri tutmaz: yalnızca bir sinyaldir.

Move, adlandırılmış alanlarla struct benzeri söz dizimi kullanır. Write, demet söz dizimini kullanarak tek bir String barındırır. ChangeColor, RGB bileşenlerini temsil eden üç değer barındırır.

Bu varyantların örneklerini oluşturmak şöyle 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 değişkenlerinin tümünün aynı türde olmasıdır: Message. Bunları aynı koleksiyonda saklayabilir, aynı işleve aktarabilir veya tek bir işlevden herhangi bir varyantı döndürebilirsiniz. Enum, her 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 veriler içeren enum'ları kullanan bir bildirim sistemi oluşturalım. Her bildirim türü farklı bilgiler taşır: bazılarında mesajlar, bazılarında sayısal değerler bulunur ve bazıları yalnızca basit sinyallerdir.

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

  • notification.rs: Üç varyanta sahip, herkese açık bir Notification enum'ı tanımlayın:
    • Alert: tek bir String mesajı tutar (tuple söz dizimi)
    • Reminder: adlandırılmış alanlar tutar: title (String) ve minutes (u32)
    • Dismiss: veri tutmaz, yalnızca bir sinyaldir
  • main.rs: Bildirim modülünüzü dahil edin ve her varyanttan bir örnek oluşturun. Ardından, üç varyantın da aynı tür 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. Bu şekilde yazdırılabilmesi için enum'ınız üzerinde Debug trait'ini türetmeniz gerekir.

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

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

Örneğin, uyarı mesajı "Server down", anımsatıcı başlığı "Meeting" ve süresi 30 dakika olduğunda çıktı şöyle olur:

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

Üç girdi alacaksınız: uyarı mesajı, anımsatıcı başlığı ve anımsatıcı dakikaları.

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

    // TODO: Create a Reminder notification using reminder_title and reminder_minutes

    // TODO: Bir Dismiss bildirimi oluştur

    // TODO: Her bildirimi debug biçimlendirmesi {:?} kullanarak yazdır
    // Her bildirim kendi satırında 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.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online Rust derleyicisi