Modül dersleri (2/2)
Desen Eşleştirme, Seçenek ve Sonuç
Rust, örüntü eşleştirme adı verilen son derece güçlü bir akış kontrol mekanizmasına sahiptir. Bir değeri bir dizi kalıpla karşılaştırmanıza ve hangi kalıbın eşleştiğine göre kod yürütmenize olanak tanır.
match Beyanı
Rust'taki match ifadesi diğer dillerdeki switch ifadesine benzer ancak çok daha güçlü ve güvenlidir. Derleyici eşleşmenin kapsamlı olmasını sağlar, yani tüm olası durumların ele alınması gerekir:
enum Direction {
North,
South,
East,
West,
}
let dir = Direction::East;
match dir {
Direction::North => println!("Andiamo a Nord"),
Direction::South => println!("Andiamo a Sud"),
Direction::East => println!("Andiamo a Est"),
Direction::West => println!("Andiamo a Ovest"),
}Değer Eksikliğini Ele Alma: Option
Rust'ta boş değer kavramı yoktur (null veya nil). Bunun yerine, standart kitaplık Option<T> adlı ve şunları içerebilen bir numaralandırmayı tanımlar:
Some(T):Ttüründe bir değer içerir.None: değerin olmadığını gösterir.
let x: Option<i32> = Some(5);
let y: Option<i32> = None;
match x {
Some(val) => println!("C'e un valore: {}", val),
None => println!("Nessun valore trovato"),
}Kurtarılabilir Hataları Ele Alma: Result
Başarısız olabilecek işlemler için (bir dosyayı okumak veya bir dizeyi bir sayıya ayrıştırmak gibi) Rust, iki değişkeni olan Result<T, E> numaralandırmasını kullanır:
Ok(T): işlem başarılı oldu veTbaşarı değerini içeriyor.Err(E): işlem başarısız oldu veEhatasını içeriyor.
fn divide(numerator: f64, denominator: f64) -> Result<f64, String> {
if denominator == 0.0 {
Err(String::from("Divisione per zero!"))
} else {
Ok(numerator / denominator)
}
}Rust'un derleyicisi sayesinde, Ok içindeki değere erişmeden önce Err durumunu ele almak zorunda kalırsınız, bu da birçok yaygın çalışma zamanı hatasını önler.
Joker Karakter Deseni _
Çok sayıda değişkene (tamsayılar gibi) sahip veri türleriyle çalışırken, tüm durumları match içinde listelemek imkansızdır. Rust, açıkça tanımlanmayan kalan tüm durumları yakalamak için _ joker karakterinin kullanılmasına izin verir:
let some_u8 = 3u8;
match some_u8 {
1 => println!("One"),
2 => println!("Two"),
_ => println!("Something else"), // Handles all other values
}Kendin dene
Some(42)'yi içeren, Option<i32> tipinde Maybe_value adında bir değişken bildirin. Maybe_value'da bir match ifadesi kullanın: Some(v) içeriyorsa print 'value is: v' (println kullanarak!), Yok içeriyorsa print 'no value'.
İpucu göster
Bir `match might_value { Some(v) => println!('value is: {}', v), Yok => println!('no value') }` bloğu yazın.
3 denemeden sonra çözüm mevcut
Check_age işlevini tamamlayın; böylece yaş 18'den büyük veya 18'e eşitse Ok('Yetişkin'), aksi takdirde Err('Minor') değerini döndürür.
İpucu göster
'Ok('Yetişkin')` veya`Err('Küçük')` ifadesinin döndürülüp döndürülmeyeceğine karar vermek için `if age >= 18` seçeneğini kullanın.
3 denemeden sonra çözüm mevcut
Active ve Inactive değişkenlerini içeren Status adlı bir numaralandırma bildirin. Ana olarak, Status::Active değerine sahip bir current_status değişkeni bildirin. Son olarak, durum Etkin ise 'etkin' veya Etkin Değil ise 'etkin değil' yazdırmak için current_status'ta bir eşleşme ifadesi kullanın.
İpucu göster
Enum'u main'den önce 'enum Status { Active, Inactive }' ile tanımlayın. Temel olarak, 'let current_status = Status::Active;' kullanın ve varyantlar üzerinde 'eşleştirme' gerçekleştirin.
3 denemeden sonra çözüm mevcut