CodeBlanks Logo Icon CodeBlanks

Hata dönüştürme

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

main.rs
use std::num::ParseIntError;

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
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&lt;A&gt; 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

Soru
impl ____<ParseIntError> for UygHata {
    fn from(e: ParseIntError) -> Self {
        UygHata::Sayi(e)
    }
}
Cevap
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)

Orta seviye bölümündeki tüm dersler