Mencocokkan Varian Data
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Rust di Coddy. Pelajaran 16 dari 61.
Di pelajaran sebelumnya, kamu menggunakan match di dalam method enum untuk menangani berbagai varian. Sekarang, mari kita fokus pada cara match mengekstrak data yang tersimpan di dalam varian tersebut: teknik yang disebut destructuring.
Saat mencocokkan varian enum yang menyimpan data, kamu dapat mengikat data tersebut ke variabel langsung di dalam pola:
enum Event {
Click { x: i32, y: i32 },
KeyPress(char),
Resize(u32, u32),
}
fn handle_event(event: Event) {
match event {
Event::Click { x, y } => {
println!("Clicked at ({}, {})", x, y);
}
Event::KeyPress(key) => {
println!("Key pressed: {}", key);
}
Event::Resize(width, height) => {
println!("Resized to {}x{}", width, height);
}
}
}
Setiap arm mengekstrak data dengan cara berbeda berdasarkan struktur variant. Untuk variant yang mirip struct, kamu menggunakan { field_name } untuk mengambil field bernama. Untuk variant tuple, kamu menggunakan variabel berdasarkan posisi seperti (width, height).
Nama variabel yang kamu pilih tersedia di dalam lengan match tersebut. Ini sangat berguna karena kamu sekaligus memeriksa varian yang kamu miliki dan mendapatkan akses ke payload-nya.
Kompilator memastikan kamu menangani setiap varian, dan nilai yang diekstrak siap langsung digunakan: tidak perlu langkah tambahan.
Tantangan
MudahMari kita buat pemroses perintah yang menangani berbagai jenis perintah pengguna. Setiap perintah membawa data yang berbeda, dan pemrosesmu akan menggunakan pencocokan pola untuk mengambil data tersebut dan menghasilkan respons yang sesuai.
Kamu akan membuat dua file untuk mengatur kodemu:
command.rs: Definisikan enum publikCommanddengan tiga varian:Say: menyimpan satu pesanString(sintaks tuple)Move: menyimpan field bernama:direction(String) dansteps(u32)Calculate: menyimpan dua nilaii32yang mewakili angka untuk dijumlahkan (sintaks tuple)
executeyang menggunakanmatchuntuk mengurai setiap varian dan mengembalikanStringyang menjelaskan tindakan yang dilakukan.main.rs: Sertakan module perintahmu, buat satu instance dari setiap varian perintah menggunakan input yang diberikan, lalu panggil methodexecutepada masing-masing untuk mencetak hasilnya.
Method execute-mu harus mengurai setiap varian untuk mengakses datanya dan mengembalikan pesan dengan format persis berikut:
- Untuk
Say:Saying: {message} - Untuk
Move:Moving {steps} steps {direction} - Untuk
Calculate:{a} + {b} = {sum}
Output-mu harus menampilkan hasil setiap perintah pada barisnya sendiri:
Saying: {message}
Moving {steps} steps {direction}
{a} + {b} = {sum}Misalnya, dengan pesan say "Hello world", perintah move sebanyak 5 langkah ke arah "north", serta perhitungan 10 dan 25, output-nya adalah:
Saying: Hello world
Moving 5 steps north
10 + 25 = 35Kamu akan menerima lima input: pesan say, arah, jumlah langkah, dan dua angka yang akan dihitung.
Coba sendiri
mod command;
use command::Command;
fn main() {
// Baca input
let mut say_message = String::new();
std::io::stdin().read_line(&mut say_message).expect("Failed to read line");
let say_message = say_message.trim().to_string();
let mut direction = String::new();
std::io::stdin().read_line(&mut direction).expect("Failed to read line");
let direction = direction.trim().to_string();
let mut steps_input = String::new();
std::io::stdin().read_line(&mut steps_input).expect("Failed to read line");
let steps: u32 = steps_input.trim().parse().expect("Failed to parse steps");
let mut num1_input = String::new();
std::io::stdin().read_line(&mut num1_input).expect("Failed to read line");
let num1: i32 = num1_input.trim().parse().expect("Failed to parse num1");
let mut num2_input = String::new();
std::io::stdin().read_line(&mut num2_input).expect("Failed to read line");
let num2: i32 = num2_input.trim().parse().expect("Failed to parse num2");
// TODO: Buat perintah Say menggunakan say_message, lalu jalankan
// TODO: Buat perintah Move menggunakan direction dan steps, lalu jalankan
// TODO: Buat perintah Calculate menggunakan num1 dan num2, lalu jalankan
// TODO: Tampilkan hasil eksekusi setiap perintah
}
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