Menu
Coddy logo textTech

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.

challenge icon

Görev

Kolay

Mevcut 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 bir TrafficLight enum'u tanımlayın:
    • Red: beklenmesi gereken saniyeleri temsil eden bir u32 içerir
    • Yellow: beklenmesi gereken saniyeleri temsil eden bir u32 içerir
    • Green: devam edilmesi gereken saniyeleri temsil eden bir u32 içerir
    Ardından, ışığı açıklayan bir status döndüren bir String yöntemi uygulayın. Her varyantı ele almak ve mesaja süreyi eklemek için yöntemin içinde match kullanı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 üzerinde status yöntemini çağırın.

status yöntemi şu tam biçimlerde mesajlar döndürmelidir:

  • Red için: Stop for {seconds} seconds
  • Yellow için: Caution for {seconds} seconds
  • Green iç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
}
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