? operatörü
- Rust kursu
- Başlangıç
- Ders 108/115
- 4 dk
? 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
use std::num::ParseIntError;
fn main() {
// buraya yaz
}Örnek çözüm
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
fn sayi(s: &str) -> Result<i32, std::num::ParseIntError> {
let n: i32 = s.parse()____;
Ok(n * 2)
}
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 |