CodeBlanks Logo Icon CodeBlanks

? operatörü

? ile hatayı otomatik olarak çağırana yayarsın.

? operatörü

?, bir Result'ı açar: Ok(v) ise v'yi verir, Err(e) ise fonksiyondan hemen Err(e) döndürür. Hata yayma kodunu tek karaktere indirir:

use std::num::ParseIntError;

fn topla(a: &str, b: &str) -> Result<i32, ParseIntError> {
    let x: i32 = a.parse()?;
    let y: i32 = b.parse()?;
    Ok(x + y)
}

? yalnızca Result (ya da Option) döndüren fonksiyonlarda kullanılabilir.

? ve From

?, hatayı döndürmeden önce From::from ile fonksiyonun hata türüne çevirir. Bu sayede farklı hata türleri tek bir türde toplanabilir:

use std::error::Error;

fn oku(s: &str) -> Result<f64, Box<dyn Error>> {
    let n: i32 = s.parse()?;          // ParseIntError → Box<dyn Error>
    let k: f64 = "2.5".parse()?;      // ParseFloatError → Box<dyn Error>
    Ok(n as f64 * k)
}

Option döndüren bir fonksiyonda ?, None'ı yukarı taşır.

Uygulama Metinleri topla

Yukarıdaki fn topla(a: &str, b: &str) -> Result<i32, ParseIntError> fonksiyonunu ? ile yaz. topla("2", "3") ve topla("2", "x") sonuçlarını {:?} ile boşlukla yazdır.

Başlangıç kodu

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

fn main() {
    // buraya yaz
}

Örnek çözüm

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

fn topla(a: &str, b: &str) -> Result<i32, ParseIntError> {
    let x: i32 = a.parse()?;
    let y: i32 = b.parse()?;
    Ok(x + y)
}

fn main() {
    println!("{:?} {:?}", topla("2", "3"), topla("2", "x"));
}

Beklenen çıktı

Ok(5) Err(ParseIntError { kind: InvalidDigit })

Soru ve cevaplar

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

1 <code>fn main() { let n: i32 = "5".parse()?; }</code> neden derlenmez?

  • "5" geçersiz
  • Derlenir
  • main () döndürüyor; ? için Result döndürmesi gerekir Doğru cevap
  • parse yanlış kullanılmış

Açıklama: main de Result döndürebilir: fn main() -> Result<(), Box<dyn std::error::Error>> { ...; Ok(()) }.

2 Hatayı yay

Soru
fn sayi(s: &str) -> Result<i32, std::num::ParseIntError> {
    let n: i32 = s.parse()____;
    Ok(n * 2)
}
Cevap
fn sayi(s: &str) -> Result<i32, std::num::ParseIntError> {
    let n: i32 = s.parse()?;
    Ok(n * 2)
}

Açıklama: ? hata durumunda Err'i hemen çağırana döndürür.

3 Yazım ve anlamı

Kavram Anlamı
x? Ok ise aç, Err ise dön
Box<dyn Error> Her hata türü
From::from Hata dönüşümü
opt? None'ı yukarı taşır

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