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.
Tantangan
MudahMari 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 publikTrafficLightdengan tiga varian:Red: menyimpanu32yang menunjukkan jumlah detik untuk menungguYellow: menyimpanu32yang menunjukkan jumlah detik untuk menungguGreen: menyimpanu32yang menunjukkan jumlah detik untuk berjalan
statusyang mengembalikanStringuntuk menjelaskan lampu tersebut. Gunakanmatchdi dalam method untuk menangani setiap varian dan sertakan durasinya dalam pesan.main.rs: Sertakan module traffic, buat instance dari setiap varian lampu, lalu panggil methodstatuspada 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} secondsMisalnya, 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 secondsKamu 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
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Method dan Perilaku
Pengantar Blok ImplementasiParameter SelfMethod MutableFungsi TerkaitBeberapa Blok ImplementasiMethod BerantaiRangkuman: Aksi Persegi Panjang4Proyek: Hewan Peliharaan Virtual
Mendefinisikan Hewan PeliharaanMemberi Makan Hewan Peliharaan2Enkapsulasi dan module
Dasar-Dasar moduleKata Kunci publicField privateGetterSetterRekap: Loker AmanLatihan sendiri: Compiler Rust online