Enum Metotları
Coddy'nin Rust Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 15 / 61.
Tıpkı struct'lar gibi, enum'lar da impl bloklarında tanımlanmış metotlara sahip olabilir. Bu, davranışı doğrudan enum türünüze eklemenize olanak tanıyarak birleşik bir arayüz aracılığıyla farklı varyantlarla çalışmayı kolaylaştırır.
Önceki dersteki Message enum'ına nasıl bir metot ekleneceği aşağıda gösterilmiştir:
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
}
impl Message {
fn describe(&self) -> String {
match self {
Message::Quit => String::from("Quit signal"),
Message::Move { x, y } => format!("Move to ({}, {})", x, y),
Message::Write(text) => format!("Message: {}", text),
}
}
}
impl Message bloğu, tıpkı yapılar (structs) için olduğu gibi çalışır. Metot, enum örneğine erişmek için &self parametresini alır. Metodun içinde, hangi varyantla çalıştığınızı belirlemek ve uygun sonucu döndürmek için match kullanırsınız.
Hangi varyanta sahip olursanız olun, metodu çağırmak aynı görünür:
fn main() {
let m1 = Message::Quit;
let m2 = Message::Move { x: 10, y: 20 };
println!("{}", m1.describe()); // Çıkış sinyali
println!("{}", m2.describe()); // (10, 20) konumuna taşı
}
Bu desen güçlüdür çünkü çağıranın hangi varyanta sahip olduğunu bilmesine gerek yoktur; sadece metodu çağırırlar ve enum geri kalanını dahili olarak halleder. Davranış varyanta göre değişir, ancak arayüz tutarlı kalır.
Görev
KolayMevcut sinyal durumunu açıklamak için metotlara sahip bir enum kullanan bir trafik ışığı sistemi oluşturalım. Her ışık rengi, ne kadar süreceği bilgisini taşıyacak ve bir metot insan tarafından okunabilir bir açıklama sağlayacaktır.
Kodunuzu düzenlemek için iki dosya oluşturacaksınız:
traffic.rs: Üç varyantı olan genel birTrafficLightenum'ı tanımlayın:Red— beklenecek saniyeyi temsil eden biru32tutarYellow— beklenecek saniyeyi temsil eden biru32tutarGreen— geçilecek saniyeyi temsil eden biru32tutar
Stringdöndüren birstatusmetodu uygulayın. Her varyantı işlemek için metodun içindematchkullanın ve süre bilgisini mesaja dahil edin.main.rs: Trafik modülünüzü içeri aktarın, her ışık varyantının örneklerini oluşturun ve açıklamaları yazdırmak için her birindestatusmetodunu çağırın.
status metodu şu tam formatlarda mesajlar döndürmelidir:
Rediçin:Stop for {seconds} secondsYellowiçin:Caution for {seconds} secondsGreeniçin:Go for {seconds} seconds
Çıktınız, her ışığın durumunu kendi satırında görüntülemelidir:
Stop for {seconds} seconds
Caution for {seconds} seconds
Go for {seconds} secondsÖrneğin, 30 saniyelik bir kırmızı ışık, 5 saniyelik sarı ve 25 saniyelik yeşil ışık ile çıktı şöyle olacaktır:
Stop for 30 seconds
Caution for 5 seconds
Go for 25 secondsÜç girdi alacaksınız: kırmızı ışık süresi, sarı ışık süresi ve yeşil ışık süresi.
Kopya kağıdı
Enum'lar, tıpkı struct'larda olduğu gibi impl blokları içinde tanımlanmış metotlara sahip olabilirler:
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
}
impl Message {
fn describe(&self) -> String {
match self {
Message::Quit => String::from("Quit signal"),
Message::Move { x, y } => format!("Move to ({}, {})", x, y),
Message::Write(text) => format!("Message: {}", text),
}
}
}
Metotlar, enum örneğine erişmek için &self parametresini alır ve farklı varyantları işlemek için match kullanır:
let m1 = Message::Quit;
let m2 = Message::Move { x: 10, y: 20 };
println!("{}", m1.describe()); // Quit signal
println!("{}", m2.describe()); // Move to (10, 20)
Çağrıyı yapan taraf, hangi varyant olursa olsun aynı arayüzü kullanır; enum, hangi varyant olduğuna bağlı olarak davranışı dahili olarak yönetir.
Kendin dene
mod traffic;
use traffic::TrafficLight;
fn main() {
// Süreler için girdiyi oku
let mut red_input = String::new();
std::io::stdin().read_line(&mut red_input).expect("Failed to read line");
let red_duration: u32 = red_input.trim().parse().expect("Invalid number");
let mut yellow_input = String::new();
std::io::stdin().read_line(&mut yellow_input).expect("Failed to read line");
let yellow_duration: u32 = yellow_input.trim().parse().expect("Invalid number");
let mut green_input = String::new();
std::io::stdin().read_line(&mut green_input).expect("Failed to read line");
let green_duration: u32 = green_input.trim().parse().expect("Invalid number");
// TODO: Giriş süreleri ile her bir TrafficLight varyantının örneklerini oluşturun
// TODO: Her ışık için status metodunu çağırın ve sonucu yazdırın
}
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
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 Player