CodeBlanks Logo Icon CodeBlanks

Null yerine Option

Null yerine Option kullanmanın avantajlarını öğrenirsin.

Null yerine Option

Başka dillerde "bulunamadı" çoğunlukla null, -1 ya da boş metinle gösterilir ve kontrol unutulunca hata çıkar. Rust'ta bulunamayabilecek her sonuç Option döndürür, kontrol de türün parçası olur:

let meyveler = ["armut", "elma", "kiraz"];
let i = meyveler.iter().position(|m| *m == "elma");   // Some(1)
let j = meyveler.iter().position(|m| *m == "muz");    // None

Vec::get, str::find, HashMap::get, iter().max() gibi pek çok yöntem bu yüzden Option döndürür.

Zincirleme yardımcılar

Option üzerinde match yazmadan çalışan yöntemler kodu kısaltır:

let sira = i.map(|n| n + 1);          // Some(2): 1'den başlayan sıra
let varsay = j.unwrap_or(0);          // 0
let var_mi = i.is_some();             // true
let metin = j.map_or("yok".to_string(), |n| n.to_string());   // "yok"

map yalnızca Some içindeki değeri dönüştürür, None'ı olduğu gibi bırakır.

Uygulama Meyve sırası

fn bul(liste: &[&str], ad: &str) -> Option<usize> yaz (iter().position). ["armut", "elma", "kiraz"] için bul(.., "elma").map(|i| i + 1).unwrap_or(0) ve aynısını "muz" için hesaplayıp boşlukla yazdır.

Başlangıç kodu

main.rs
fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
fn bul(liste: &[&str], ad: &str) -> Option<usize> {
    liste.iter().position(|m| *m == ad)
}

fn main() {
    let meyveler = ["armut", "elma", "kiraz"];
    let a = bul(&meyveler, "elma").map(|i| i + 1).unwrap_or(0);
    let b = bul(&meyveler, "muz").map(|i| i + 1).unwrap_or(0);
    println!("{} {}", a, b);
}

Beklenen çıktı

2 0

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 <code>Vec::new::&lt;i32&gt;().iter().max()</code> ne döndürür?

  • Some(0)
  • None Doğru cevap
  • 0
  • Panic

Açıklama: Boş bir koleksiyonun en büyük elemanı yoktur; bu durum None ile dürüstçe ifade edilir.

2 Varsayılan değer

Soru
let j: Option<usize> = None;
let n = j.____(0);   // 0
Cevap
let j: Option<usize> = None;
let n = j.unwrap_or(0);   // 0

Açıklama: unwrap_or, None durumunda verilen varsayılanı döndürür.

3 Yöntem ve None üzerinde sonucu

Kavram Anlamı
is_some() false
unwrap_or(7) 7
map(|n| n + 1) None
unwrap() Panic

Başlangıç bölümündeki tüm dersler

16 Proje: Yapılacaklar listesi

  1. Görev modeli
  2. Ekleme
  3. Listeleme
  4. İşaretleme
  5. Komut okuma