CodeBlanks Logo Icon CodeBlanks

Result<T, E>

Result<T, E> türü ve Ok/Err variantlarını öğrenirsin.

Result<T, E>

Rust hataları iki gruba ayırır: kurtarılabilir hatalar (dosya yok, girdi geçersiz) Result ile döndürülür; kurtarılamaz hatalar (program hatası) panic! ile durdurulur. Result bir enum'dır:

enum Result<T, E> {
    Ok(T),    // başarı ve değer
    Err(E),   // hata ve açıklama
}

let a: Result<i32, _> = "42".parse::<i32>();   // Ok(42)
let b = "x".parse::<i32>();                     // Err(ParseIntError)

İstisna (exception) yoktur; hata, dönüş türünde açıkça görünür.

Hatayı dönüştürmek

map_err hata türünü değiştirir, map başarı değerini. Kullanıcıya gösterilecek bir mesaja çevirmek yaygın bir kullanımdır:

fn yas_oku(s: &str) -> Result<u8, String> {
    s.trim()
        .parse::<u8>()
        .map_err(|e| format!("geçersiz yaş: {e}"))
}

println!("{:?}", yas_oku(" 30 "));   // Ok(30)
println!("{:?}", yas_oku("300"));    // Err("geçersiz yaş: number too large to fit in target type")

Uygulama Yaş oku

Yukarıdaki fn yas_oku(s: &str) -> Result<u8, String> fonksiyonunu yaz. "30" ve "abc" için sonuçları {:?} ile boşlukla ayırarak yazdır.

Başlangıç kodu

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

Örnek çözüm

main.rs
fn yas_oku(s: &str) -> Result<u8, String> {
    s.trim()
        .parse::<u8>()
        .map_err(|e| format!("geçersiz yaş: {e}"))
}

fn main() {
    println!("{:?} {:?}", yas_oku("30"), yas_oku("abc"));
}

Beklenen çıktı

Ok(30) Err("geçersiz yaş: invalid digit found in string")

Soru ve cevaplar

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

1 Bir fonksiyonun başarısız olabileceğini çağıran nasıl anlar?

  • Dönüş türü Result<T, E> olduğundan Doğru cevap
  • Belgeleri okuyarak
  • Çalıştırınca
  • throws anahtar kelimesinden

Açıklama: Hata olasılığı imzada yazar ve derleyici Result'ın kullanılmasını ister (unused Result uyarısı).

2 Hata türünü değiştir

Soru
s.parse::<u8>().____(|e| format!("geçersiz: {e}"))
Cevap
s.parse::<u8>().map_err(|e| format!("geçersiz: {e}"))

Açıklama: map_err yalnızca Err içindeki değeri dönüştürür.

3 İfade ve sonuç

Kavram Anlamı
"42".parse::<i32>() Ok(42)
"x".parse::<i32>() Err(..)
Ok(2).map(|n| n * 3) Ok(6)
"300".parse::<u8>() Err: sığmıyor

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