Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Mari 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 publik Profile dengan dua field: username (String) dan nickname (Option<String>). Implementasikan:
    • Constructor new yang menerima username dan nama panggilan opsional
    • Method display_name yang mengembalikan nama panggilan jika ada, atau username sebagai nilai cadangan: gunakan unwrap_or untuk menanganinya
    • Method formatted_nickname yang mengembalikan Option<String> dengan nama panggilan yang diapit tanda kurung siku (seperti "[CoolNick]") jika ada, atau None jika tidak ada nama panggilan: gunakan map untuk mengubah nilainya
  • 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 method Option menangani 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: None

Kamu 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
}
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