Enum dengan Data
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Rust di Coddy. Pelajaran 14 dari 61.
Enum dasar di Rust memungkinkan kamu mendefinisikan tipe dengan sekumpulan varian tetap, seperti Direction::North atau Status::Active. Namun, enum Rust jauh lebih canggih dari itu. Setiap varian dapat membawa datanya sendiri, sehingga enum sangat fleksibel untuk memodelkan situasi dunia nyata.
Pertimbangkan sistem pesan yang memiliki berbagai jenis pesan dengan informasi yang berbeda. Pesan teks memiliki konten, perintah gerakan memiliki koordinat, dan sinyal keluar tidak memiliki apa pun. Di Rust, kamu bisa merepresentasikan semuanya dengan satu enum:
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
ChangeColor(u8, u8, u8),
}
Setiap varian memiliki bentuk yang berbeda. Quit tidak menyimpan data: varian ini hanya sebuah sinyal.
Move menggunakan sintaks mirip struct dengan field bernama. Write menyimpan satu String menggunakan sintaks tuple. ChangeColor menyimpan tiga nilai yang mewakili komponen RGB.
Untuk membuat instance dari varian-varian ini, caranya seperti berikut:
let m1 = Message::Quit;
let m2 = Message::Move { x: 10, y: 20 };
let m3 = Message::Write(String::from("Hello"));
let m4 = Message::ChangeColor(255, 128, 0);
Keunggulan pendekatan ini adalah m1, m2, m3, dan m4 semuanya memiliki tipe yang sama: Message. Kamu bisa menyimpannya dalam koleksi yang sama, meneruskannya ke fungsi yang sama, atau mengembalikan varian apa pun dari satu fungsi. enum menyatukan bentuk data yang berbeda dalam satu tipe sekaligus mempertahankan informasi spesifik yang dibutuhkan setiap varian.
Tantangan
MudahMari buat sistem notifikasi yang menggunakan enum dengan data untuk merepresentasikan berbagai jenis peringatan. Setiap jenis notifikasi membawa informasi yang berbeda: ada yang memiliki pesan, ada yang memiliki nilai numerik, dan ada yang hanya berupa sinyal sederhana.
Kamu akan membuat dua file untuk mengatur kodemu:
notification.rs: Definisikan enumNotificationpublik dengan tiga varian:Alert: menyimpan satu pesanString(sintaks tuple)Reminder: menyimpan field bernama:title(String) danminutes(u32)Dismiss: tidak menyimpan data, hanya berupa sinyal
main.rs: Masukkan module notifikasimu dan buat satu instance dari setiap varian. Lalu, cetak informasi tentang setiap notifikasi untuk menunjukkan bahwa ketiga varian bertipe sama, tetapi membawa data yang berbeda.
Saat mencetak, gunakan format debug ({:?}) untuk menampilkan setiap notifikasi. Kamu perlu menerapkan trait Debug pada enum-mu agar bisa dicetak dengan cara ini.
Output-mu harus menampilkan ketiga notifikasi, masing-masing pada barisnya sendiri:
Alert("{message}")
Reminder { title: "{title}", minutes: {minutes} }
DismissMisalnya, dengan pesan peringatan "Server down", pengingat dengan judul "Meeting", dan 30 menit, output-nya akan seperti ini:
Alert("Server down")
Reminder { title: "Meeting", minutes: 30 }
DismissKamu akan menerima tiga input: pesan peringatan, judul pengingat, dan menit pengingat.
Coba sendiri
mod notification;
use notification::Notification;
fn main() {
// Baca input
let mut alert_message = String::new();
std::io::stdin().read_line(&mut alert_message).expect("Failed to read line");
let alert_message = alert_message.trim().to_string();
let mut reminder_title = String::new();
std::io::stdin().read_line(&mut reminder_title).expect("Failed to read line");
let reminder_title = reminder_title.trim().to_string();
let mut minutes_input = String::new();
std::io::stdin().read_line(&mut minutes_input).expect("Failed to read line");
let reminder_minutes: u32 = minutes_input.trim().parse().expect("Failed to parse minutes");
// TODO: Buat notifikasi Alert menggunakan alert_message
// TODO: Buat notifikasi Reminder menggunakan reminder_title dan reminder_minutes
// TODO: Buat notifikasi Dismiss
// TODO: Cetak setiap notifikasi menggunakan format debug {:?}
// Cetak setiap notifikasi pada baris tersendiri
}
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