Hata dönüştürme
- Rust kursu
- Orta seviye
- Ders 68/115
- 4 dk
From trait'i ile hata türleri arasında dönüşüm yaparsın.
Hata dönüştürme
?, hatayı döndürmeden önce From::from çağırır. Kendi hata türün için From uygularsan alt hatalar otomatik dönüşür:
use std::num::ParseIntError;
#[derive(Debug)]
enum UygHata {
Sayi(ParseIntError),
Bos,
}
impl From<ParseIntError> for UygHata {
fn from(e: ParseIntError) -> Self {
UygHata::Sayi(e)
}
}Artık Result<_, UygHata> döndüren bir fonksiyonda s.parse::<i32>()? doğrudan çalışır.
Kullanımı
Dönüşüm sayesinde fonksiyon gövdesi sade kalır; çağıran ise hatanın türüne göre davranabilir:
fn ikile(s: &str) -> Result<i32, UygHata> {
if s.is_empty() {
return Err(UygHata::Bos);
}
Ok(s.parse::<i32>()? * 2) // ParseIntError → UygHata::Sayi
}
match ikile("") {
Err(UygHata::Bos) => println!("girdi boş"),
Err(UygHata::Sayi(e)) => println!("sayı değil: {e}"),
Ok(n) => println!("{n}"),
}Uygulama Otomatik dönüşüm
Yukarıdaki UygHata, From uygulaması ve ikile fonksiyonunu yaz. ikile("21"), ikile("") ve ikile("x") sonuçlarını {:?} ile ayrı satırlara yazdır.
Başlangıç kodu
use std::num::ParseIntError;
fn main() {
// buraya yaz
}Örnek çözüm
use std::num::ParseIntError;
#[derive(Debug)]
enum UygHata {
Sayi(ParseIntError),
Bos,
}
impl From<ParseIntError> for UygHata {
fn from(e: ParseIntError) -> Self {
UygHata::Sayi(e)
}
}
fn ikile(s: &str) -> Result<i32, UygHata> {
if s.is_empty() {
return Err(UygHata::Bos);
}
Ok(s.parse::<i32>()? * 2)
}
fn main() {
println!("{:?}", ikile("21"));
println!("{:?}", ikile(""));
println!("{:?}", ikile("x"));
}Beklenen çıktı
Ok(42)
Err(Bos)
Err(Sayi(ParseIntError { kind: InvalidDigit }))
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 <code>From<A> for B</code> uygulayınca hangisi de ücretsiz gelir?
- Into<B> for A Doğru cevap
- From<B> for A
- Display for B
- Clone for A
Açıklama: Standart kütüphanede genel bir impl vardır: From uygulayan her çift için Into otomatik sağlanır. Bu yüzden From yazmak tercih edilir.
2 Dönüşüm trait'i
impl ____<ParseIntError> for UygHata {
fn from(e: ParseIntError) -> Self {
UygHata::Sayi(e)
}
}
impl From<ParseIntError> for UygHata {
fn from(e: ParseIntError) -> Self {
UygHata::Sayi(e)
}
}
Açıklama: ? operatörü dönüşüm için From'u kullanır.
3 Çağrı ve sonuç
| Kavram | Anlamı |
|---|---|
ikile("21") |
Ok(42) |
ikile("") |
Err(Bos) |
ikile("x") |
Err(Sayi(..)) |
ikile("-3") |
Ok(-6) |