Result<T, E>
- Rust kursu
- Başlangıç
- Ders 106/115
- 4 dk
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
fn main() {
// buraya yaz
}Örnek çözüm
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
s.parse::<u8>().____(|e| format!("geçersiz: {e}"))
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 |