Meninjau Kembali Enum Option
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Rust di Coddy. Pelajaran 17 dari 61.
Kamu sudah pernah menemukan Option<T> di Rust: ini adalah enum standar untuk merepresentasikan nilai yang mungkin ada atau tidak ada. Sekarang, mari kita lihat dari sudut pandang OOP: Option bukan sekadar enum, melainkan tipe dengan method bawaan yang canggih untuk menangani nilai nullable dengan aman dan elegan.
Daripada mencocokkan setiap kali, kamu bisa menggunakan method langsung pada nilai Option. Method unwrap_or mengembalikan nilai di dalamnya jika ada, atau nilai default yang kamu berikan:
let maybe_name: Option<String> = Some(String::from("Alice"));
let name = maybe_name.unwrap_or(String::from("Guest"));
println!("{}", name); // Alice
let empty: Option<String> = None;
let fallback = empty.unwrap_or(String::from("Guest"));
println!("{}", fallback); // Guest
method map mengubah nilai di dalamnya jika ada, dan membiarkan None tetap sama. Dengan begitu, kamu bisa merangkai operasi tanpa terus-menerus memeriksa None:
let maybe_num: Option<i32> = Some(5);
let doubled = maybe_num.map(|x| x * 2);
println!("{:?}", doubled); // Some(10)
let nothing: Option<i32> = None;
let still_nothing = nothing.map(|x| x * 2);
println!("{:?}", still_nothing); // None
Method-method ini mencerminkan prinsip OOP: tipe Option merangkum konsep "mungkin ada nilai" dan menyediakan antarmuka yang jelas untuk menggunakannya. Kamu memanggil method pada object, bukan menulis logika eksternal untuk memeriksanya.
Tantangan
MudahMari buat sistem profil pengguna yang menangani data opsional dengan baik menggunakan method Option. Pengguna mungkin memiliki nama panggilan atau tidak. Sistemmu akan menangani kedua kasus dengan baik tanpa pencocokan eksplisit.
Kamu akan membuat dua file untuk mengatur kodemu:
profile.rs: Definisikan struct publikProfiledengan dua field:username(String) dannickname(Option<String>). Implementasikan:- Constructor
newyang menerima username dan nama panggilan opsional - Method
display_nameyang mengembalikan nama panggilan jika ada, atau username sebagai nilai cadangan: gunakanunwrap_oruntuk menanganinya - Method
formatted_nicknameyang mengembalikanOption<String>dengan nama panggilan yang diapit tanda kurung siku (seperti"[CoolNick]") jika ada, atauNonejika tidak ada nama panggilan: gunakanmapuntuk mengubah nilainya
- Constructor
main.rs: Muat module profilmu dan buat dua profil: satu dengan nama panggilan dan satu tanpa nama panggilan. Tunjukkan kedua method pada setiap profil untuk memperlihatkan cara methodOptionmenangani nilai yang ada dan tidak ada dengan cara berbeda.
Untuk method formatted_nickname, gunakan format debug ({:?}) saat mencetak karena method ini mengembalikan Option.
Output-mu harus mengikuti format persis ini, yang menampilkan kedua profil:
Display name: {name}
Formatted nickname: {option}
Display name: {name}
Formatted nickname: {option}Contohnya, dengan profil untuk username "alice" yang memiliki nama panggilan "Ace", dan profil lain untuk username "bob" tanpa nama panggilan, output-nya adalah:
Display name: Ace
Formatted nickname: Some("[Ace]")
Display name: bob
Formatted nickname: NoneKamu akan menerima tiga input: username pertama, nama panggilan pengguna pertama, dan username kedua (yang tidak memiliki nama panggilan).
Coba sendiri
mod profile;
use profile::Profile;
fn main() {
// Baca input
let mut input1 = String::new();
std::io::stdin().read_line(&mut input1).expect("Failed to read line");
let username1 = input1.trim().to_string();
let mut input2 = String::new();
std::io::stdin().read_line(&mut input2).expect("Failed to read line");
let nickname1 = input2.trim().to_string();
let mut input3 = String::new();
std::io::stdin().read_line(&mut input3).expect("Failed to read line");
let username2 = input3.trim().to_string();
// TODO: Buat profil pertama dengan username1 dan nickname1 (Some)
// TODO: Buat profil kedua dengan username2 tanpa nama panggilan (None)
// TODO: Cetak display_name dan formatted_nickname untuk profil pertama
// Gunakan {:?} untuk formatted_nickname karena mengembalikan Option
// TODO: Cetak display_name dan formatted_nickname untuk profil kedua
}
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 Aman3Enum Lanjutan
Enum dengan Datamethod pada EnumMencocokkan Varian DataMeninjau Kembali Enum OptionRingkasan: Enum ShapeLatihan sendiri: Compiler Rust online