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.
Görev
KolayFarklı 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 birNotificationenum'ı tanımlayın:Alert: tek birStringmesajı tutar (tuple söz dizimi)Reminder: adlandırılmış alanlar tutar:title(String) veminutes(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
}
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
1Metotlar ve Davranış
Uygulama Bloklarına GirişSelf ParametresiDeğiştirilebilir Metotlarİlişkili FonksiyonlarBirden Fazla Uygulama BloğuMetot ZincirlemeÖzet - Dikdörtgen Eylemleri4Proje: Sanal Evcil Hayvan
Evcil Hayvanı TanımlamaEvcil Hayvanı Besleme2Kapsülleme ve Modüller
Modül TemelleriPublic Anahtar KelimesiPrivate AlanlarGetter'larSetter'larÖzet - Güvenli Kasa5Generic Yapılar
Generic Struct'larGeneric MetotlarÇoklu Generic TürlerGeneric FonksiyonlarÖzet - Koordinat Noktası8Sınırlandırıcı Olarak Trait'ler
Trait Sınırlandırıcı SözdizimiÇoklu SınırlandırıcılarWhere CümleciğiTrait'ler ile Tip DöndürmeÖzet - Generic Yazıcı11Rust'ta Tasarım Kalıpları
Newtype KalıbıKompozisyonDrop Trait'iFrom ve IntoÖzet - Smart Pointer Mock3İleri Seviye Enum'lar
Veri İçeren Enum'larEnum MetotlarıVeri Varyantlarını EşlemeOption Enum'ına Yeniden BakışÖzet - Shape Enum6Trait Tanımlama
Trait Nedir?Traitleri UygulamaVarsayılan UygulamalarVarsayılanları Geçersiz KılmaParametreli TraitlerÖzet - Media PlayerKendi başına pratik yap: Online Rust derleyicisi