Menu
CoddyTech

method pada Enum

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Rust di Coddy. Pelajaran 15 dari 61.

Sama seperti struct, enum dapat memiliki method yang didefinisikan dalam blok impl. Dengan begitu, kamu dapat menambahkan perilaku langsung ke tipe enum-mu, sehingga kamu dapat bekerja dengan berbagai varian melalui satu antarmuka yang terpadu.

Berikut cara menambahkan method ke enum Message dari pelajaran sebelumnya:

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),
        }
    }
}

Blok impl Message bekerja persis seperti pada struct. Method ini menerima &self untuk mengakses instance enum. Di dalam method, kamu menggunakan match untuk menentukan varian yang sedang kamu tangani dan mengembalikan hasil yang sesuai.

Memanggil method tampak sama, apa pun varian yang kamu miliki:

fn main() {
    let m1 = Message::Quit;
    let m2 = Message::Move { x: 10, y: 20 };
    
    println!("{}", m1.describe());  // Sinyal Quit
    println!("{}", m2.describe());  // Move ke (10, 20)
}

Pola ini ampuh karena pemanggil tidak perlu tahu varian mana yang dimilikinya. Pemanggil cukup memanggil method, lalu enum menangani sisanya secara internal. Perilakunya berubah berdasarkan varian, tetapi interface tetap konsisten.

challenge icon

Tantangan

Mudah

Mari kita buat sistem lampu lalu lintas yang menggunakan enum dengan method untuk menjelaskan keadaan sinyal saat ini. Setiap warna lampu akan menyimpan informasi tentang berapa lama lampu menyala, dan sebuah method akan memberikan deskripsi yang mudah dibaca.

Kamu akan membuat dua file untuk mengatur kodemu:

  • traffic.rs: Definisikan enum publik TrafficLight dengan tiga varian:
    • Red: menyimpan u32 yang menunjukkan jumlah detik untuk menunggu
    • Yellow: menyimpan u32 yang menunjukkan jumlah detik untuk menunggu
    • Green: menyimpan u32 yang menunjukkan jumlah detik untuk berjalan
    Lalu, implementasikan method status yang mengembalikan String untuk menjelaskan lampu tersebut. Gunakan match di dalam method untuk menangani setiap varian dan sertakan durasinya dalam pesan.
  • main.rs: Sertakan module traffic, buat instance dari setiap varian lampu, lalu panggil method status pada setiap instance untuk mencetak deskripsinya.

Method status harus mengembalikan pesan dalam format persis berikut:

  • Untuk Red: Stop for {seconds} seconds
  • Untuk Yellow: Caution for {seconds} seconds
  • Untuk Green: Go for {seconds} seconds

Output-mu harus menampilkan status setiap lampu pada barisnya sendiri:

Stop for {seconds} seconds
Caution for {seconds} seconds
Go for {seconds} seconds

Misalnya, dengan lampu merah berdurasi 30 detik, lampu kuning 5 detik, dan lampu hijau 25 detik, output-nya akan seperti berikut:

Stop for 30 seconds
Caution for 5 seconds
Go for 25 seconds

Kamu akan menerima tiga input: durasi lampu merah, durasi lampu kuning, dan durasi lampu hijau.

Coba sendiri

mod traffic;

use traffic::TrafficLight;

fn main() {
    // Baca input untuk durasi
    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: Buat instance dari setiap varian TrafficLight dengan durasi dari input

    // TODO: Panggil method status pada setiap lampu dan cetak hasilnya
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Rust online