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.
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 birProfilestruct'ı tanımlayın:username(String) venickname(Option<String>). Şunları uygulayın:- Bir kullanıcı adı ve isteğe bağlı bir takma ad alan
newkurucusu - Varsa takma adı, yoksa yedek değer olarak kullanıcı adını döndüren bir
display_nameyöntemi: bunu yönetmek içinunwrap_orkullanın - Varsa takma adı köşeli parantezler içine alan (örneğin
formatted_nickname) birOption<String>döndüren, takma ad yoksa"[CoolNick]"döndüren birNoneyöntemi: değeri dönüştürmek içinmapkullanın
- Bir kullanıcı adı ve isteğe bağlı bir takma ad alan
main.rs: Profil modülünüzü dahil edin ve biri takma adlı, diğeri takma adsız iki profil oluşturun.Optionyö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
}
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
1Metotlar ve Davranış
Uygulama Bloklarına GirişSelf ParametresiDeğiştirilebilir Metotlarİlişkili FonksiyonlarBirden Fazla Uygulama BloğuMetot ZincirlemeÖzet - Dikdörtgen Eylemleri4Proje: Sanal Evcil Hayvan
Evcil Hayvanı TanımlamaEvcil Hayvanı Besleme2Kapsülleme ve Modüller
Modül TemelleriPublic Anahtar KelimesiPrivate AlanlarGetter'larSetter'larÖzet - Güvenli Kasa5Generic Yapılar
Generic Struct'larGeneric MetotlarÇoklu Generic TürlerGeneric FonksiyonlarÖzet - Koordinat Noktası8Sınırlandırıcı Olarak Trait'ler
Trait Sınırlandırıcı SözdizimiÇoklu SınırlandırıcılarWhere CümleciğiTrait'ler ile Tip DöndürmeÖzet - Generic Yazıcı11Rust'ta Tasarım Kalıpları
Newtype KalıbıKompozisyonDrop Trait'iFrom ve IntoÖzet - Smart Pointer Mock3İleri Seviye Enum'lar
Veri İçeren Enum'larEnum MetotlarıVeri Varyantlarını EşlemeOption Enum'ına Yeniden BakışÖzet - Shape Enum6Trait Tanımlama
Trait Nedir?Traitleri UygulamaVarsayılan UygulamalarVarsayılanları Geçersiz KılmaParametreli TraitlerÖzet - Media PlayerKendi başına pratik yap: Online Rust derleyicisi