Menu
Coddy logo textTech

Option Enum'ına Yeniden Bakış

Coddy'nin Rust Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 17 / 61.

Rust'ta daha önce Option<T> ile karşılaştın: bu, var olabilecek veya olmayabilecek değerleri temsil etmek için kullanılan standart enum'dur. Şimdi ona OOP perspektifinden bakalım: Option yalnızca bir enum değil, null olabilir değerleri güvenli ve zarif bir şekilde işlemene olanak tanıyan güçlü yerleşik metotlara sahip bir türdür.

Her seferinde eşleştirme yapmak yerine, yöntemleri doğrudan Option değerleri üzerinde kullanabilirsin. unwrap_or yöntemi, iç değer varsa onu, yoksa senin sağladığın varsayılan değeri döndürür:

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

map metodu, iç değer mevcutsa onu dönüştürür ve None değerini değiştirmeden bırakır. Bu, sürekli None kontrolü yapmadan işlemleri zincirlemenizi sağlar:

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

Bu yöntemler OOP ilkelerini somutlaştırır: Option türü, "belki bir değer" kavramını kapsüller ve onunla çalışmak için temiz bir arayüz sağlar. Nesneyi incelemek üzere harici mantık yazmak yerine nesne üzerinde yöntemleri çağırırsın.

challenge icon

Görev

Kolay

İsteğe bağlı verileri Option yöntemlerini kullanarak zarif bir şekilde işleyen bir kullanıcı profili sistemi oluşturalım. Kullanıcıların bir takma adı olabilir veya olmayabilir. Sisteminiz, açık eşleştirme yapmadan her iki durumu da zarif bir şekilde yönetecek.

Kodunuzu düzenlemek için iki dosya oluşturacaksınız:

  • profile.rs: İki alana sahip herkese açık bir Profile struct'ı tanımlayın: username (String) ve nickname (Option<String>). Şunları uygulayın:
    • Bir kullanıcı adı ve isteğe bağlı bir takma ad alan new kurucusu
    • Varsa takma adı, yoksa yedek değer olarak kullanıcı adını döndüren bir display_name yöntemi: bunu yönetmek için unwrap_or kullanın
    • Varsa takma adı köşeli parantezler içine alan (örneğin formatted_nickname) bir Option<String> döndüren, takma ad yoksa "[CoolNick]" döndüren bir None yöntemi: değeri dönüştürmek için map kullanın
  • main.rs: Profil modülünüzü dahil edin ve biri takma adlı, diğeri takma adsız iki profil oluşturun. Option yöntemlerinin mevcut ve mevcut olmayan değerleri nasıl farklı şekilde ele aldığını göstermek için her profil üzerinde her iki yöntemi de kullanın.

formatted_nickname yöntemi için, bir {:?} döndürdüğünden yazdırırken debug biçimlendirmesini (Option) kullanın.

Çıktınız, her iki profili göstererek tam olarak şu biçimi izlemelidir:

Display name: {name}
Formatted nickname: {option}
Display name: {name}
Formatted nickname: {option}

Örneğin, kullanıcı adı "alice" ve takma adı "Ace" olan bir profil ile takma adı olmayan, kullanıcı adı "bob" olan başka bir profil için çıktı şöyle olur:

Display name: Ace
Formatted nickname: Some("[Ace]")
Display name: bob
Formatted nickname: None

Üç girdi alacaksınız: ilk kullanıcı adı, ilk kullanıcının takma adı ve takma adı olmayan ikinci kullanıcının kullanıcı adı.

Kendin dene

mod profile;

use profile::Profile;

fn main() {
    // Girdileri oku
    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: username1 ve nickname1 ile ilk profili oluştur (Some)
    
    // TODO: Create second profile with username2 and no nickname (None)
    
    // TODO: Print display_name and formatted_nickname for first profile
    // Use {:?} for formatted_nickname since it returns an Option
    
    // TODO: Print display_name and formatted_nickname for second profile
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online Rust derleyicisi