Enum Metotları
Coddy'nin Rust Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 15 / 61.
Struct'lar gibi, enum'lar da impl bloklarında tanımlanmış metotlara sahip olabilir. Bu, davranışı doğrudan enum türünüze eklemenizi ve farklı varyantlarla birleşik bir arayüz üzerinden çalışmayı kolaylaştırmanızı sağlar.
Önceki dersteki Message enum'una bir metot şu şekilde eklenir:
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, yapılar için olduğu gibi çalışır. Metot, enum örneğine erişmek için &self alır. Metodun içinde, hangi varyantla ilgilendiğinizi belirlemek ve uygun sonucu döndürmek için match kullanırsınız.
Hangi varyanta sahip olursanız olun, yöntemi ç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 bilmesi gerekmez. Yalnızca yöntemi çağırır ve enum geri kalanını dahili olarak ele alır. Davranış varyanta göre değişir, ancak arayüz tutarlı kalır.
Görev
KolayMevcut sinyal durumunu açıklamak için yöntemlere sahip bir enum kullanan bir trafik ışığı sistemi oluşturalım. Her ışık rengi ne kadar sürdüğüyle ilgili bilgi taşıyacak ve bir yöntem insanlar tarafından okunabilir bir açıklama sağlayacak.
Kodunuzu düzenlemek için iki dosya oluşturacaksınız:
traffic.rs: Üç varyanta sahip herkese açık birTrafficLightenum'u tanımlayın:Red: beklenmesi gereken saniyeleri temsil eden biru32içerirYellow: beklenmesi gereken saniyeleri temsil eden biru32içerirGreen: devam edilmesi gereken saniyeleri temsil eden biru32içerir
statusdöndüren birStringyöntemi uygulayın. Her varyantı ele almak ve mesaja süreyi eklemek için yöntemin içindematchkullanın.main.rs: Trafik modülünüzü dahil edin, her ışık varyantının örneklerini oluşturun ve açıklamaları yazdırmak için her biri üzerindestatusyöntemini çağırın.
status yöntemi şu tam biçimlerde 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östermelidir:
Stop for {seconds} seconds
Caution for {seconds} seconds
Go for {seconds} secondsÖrneğin, kırmızı ışık 30 saniye, sarı ışık 5 saniye ve yeşil ışık 25 saniye olduğunda çıktı şu şekilde olur:
Stop for 30 seconds
Caution for 5 seconds
Go for 25 secondsÜç girdi alacaksınız: kırmızı ışığın süresi, sarı ışığın süresi ve yeşil ışığın süresi.
Kendin dene
mod traffic;
use traffic::TrafficLight;
fn main() {
// Süreler için girdi 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: Girdi süreleriyle her TrafficLight varyantının örneklerini oluştur
// TODO: Her ışıkta status metodunu çağır ve sonucu yazdı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