Soru İşareti Operatörü '?'
Coddy'nin Rust Journey'sinin Mantık & Akış bölümünün bir parçası. Ders 46 / 66.
Result döndüren işlevlerle çalışırken, genellikle hataları ya yerel olarak ele almanız ya da çağıran işleve aktarmanız gerekir. Rust, bu yaygın kalıp için zarif bir işleç sağlar: soru işareti işleci ?.
? operatörü, ayrıntılı match ifadeleri yazmadan hataları yaymak için temiz bir yol sağlar. ? işaretini bir Result değerinin sonuna yerleştirdiğinde, bir Ok değerini otomatik olarak açar veya Err ile mevcut işlevden hemen döner:
fn parse_and_double(s: &str) -> Result<i32, std::num::ParseIntError> {
let number = s.parse::<i32>()?; // Ayrıştırma başarısız olursa, hatayı döndür
Ok(number * 2) // Başarılı olursa, sayıyı ikiye katla
}Bu, eksiksiz bir match ifadesi yazmaya eşdeğerdir, ancak çok daha özlüdür. s.parse::<i32>() bir Ok döndürürse, ? değeri çıkarır ve bunu number değişkenine atar. Bir Err döndürürse, ? bu hatayı hemen tüm işlevden döndürür.
::<i32> sözdizimine dikkat edin. Buna turbofish denir ve Rust'a dizenin hangi türe ayrıştırılacağını bildirir. İşlev, Result<i32, std::num::ParseIntError> döndürür; burada i32 başarılı sonuç türü, std::num::ParseIntError ise ayrıştırma başarısız olduğunda döndürülen hata türüdür.
? operatörü yalnızca bir Result (veya Option) döndüren işlevlerde kullanılabilir; çünkü bir hatayı döndürebilmesi gerekir.
Görev
Kolayİki girdi alacaksınız. İlk girdi bir tam sayıya ayrıştırılması gereken bir dizedir ve ikinci girdi de yine bir tam sayıya ayrıştırılması gereken başka bir dizedir. İki dize dilimini parametre olarak alan ve add_numbers döndüren Result<i32, std::num::ParseIntError> adlı bir işlev oluşturun. İşlevin içinde, her iki dizeyi ayrıştırmak ve toplamlarını ? içine sararak döndürmek için Ok işlecini kullanın. İşlevi iki girdiyle çağırın ve sonucu match kullanarak işleyin.
Gereksinimler:
- İlk girdiyi (dize olarak ilk sayıyı) okuyun ve boşlukları kırpın
- İkinci girdiyi (dize olarak ikinci sayıyı) okuyun ve boşlukları kırpın
- İki
add_numbersparametresi alan ve&strdöndüren birResult<i32, std::num::ParseIntError>işlevi oluşturun - İşlevin içinde,
i32işlecini kullanarak ilk dizeyi?türüne ayrıştırın - İkinci dizeyi
i32işlecini kullanarak?türüne ayrıştırın - Her iki ayrıştırılmış sayının toplamı olan
Ok(sum)değerini döndürün - İşlevi iki girdi dizesiyle çağırın
matchdeğerini işlemek için birResultifadesi kullanınOk(value)kolunda şunu yazdırın:Sum: [value]Err(_)kolunda şunu yazdırın:Parsing error
Girdi:
- İlk satır: Bir sayıyı temsil eden dize (ör.
15) - İkinci satır: Başka bir sayıyı temsil eden dize (ör.
27)
Çıktı:
- Her iki dize de geçerli sayılarsa:
Sum: [result] - Dizelerden biri ayrıştırılamazsa:
Parsing error
Kendin dene
use std::io;
// TODO: add_numbers fonksiyonunu burada oluştur
// İki &str parametresi almalı ve Result<i32, std::num::ParseIntError> döndürmelidir
fn main() {
// İlk girişi oku
let mut input1 = String::new();
io::stdin().read_line(&mut input1).expect("Failed to read line");
let input1 = input1.trim();
// İkinci girişi oku
let mut input2 = String::new();
io::stdin().read_line(&mut input2).expect("Failed to read line");
let input2 = input2.trim();
// TODO: add_numbers'ı input1 ve input2 ile çağır
// TODO: Result'ı işlemek için match kullan
// Ok(value) için "Sum: [value]" yazdır
// Print "Parsing error" for Err(_)
}Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Mantık & Akış bölümündeki tüm dersler
1İleri Seviye Kontrol Akışı
'match' İfadesiBirden Çok Değeri EşleştirmeAralıkları Eşleştirme'if let' İfadesiİfade Olarak DöngülerÖzet - Basit Komut Ayrıştırıcı4Struct'lar ile Verileri Gruplama
Struct Nedir?Struct'lara Genel BakışStruct Alanlarına ErişmeMutable Struct'larFonksiyon Parametresi Olarak Struct'larTuple Struct'larÖzet - Bir Kitap Struct'ı Oluşturun7'Result' ile Hata Yönetimi
'Result' Nedir?'Result' ile 'match' Kullanımıis_ok() ve is_err()Kısayollar: unwrap ve expectSoru İşareti Operatörü '?'String'leri Sayılara DönüştürmeÖzet - Güvenli Bölme Fonksiyonu10Closures ve Anonim Fonksiyonlar
Closure Nedir?Basit Bir Closure TanımlamaParametreli Closure'larOrtamı YakalamakÖzet - Basit Toplayıcı Closure2Vektörlere Giriş
Vektör Nedir?Vektör Oluşturmapush ile Eleman EklemeVektör Elemanlarına ErişmeVektör Üzerinde YinelemeDeğiştirilebilir YinelemeEleman KaldırmaÖzet - Temel Skor Takipçisi5Hash Map'ler ile Anahtar-Değer Çiftleri
Hash Map Nedir?Bir Hash Map OluşturmaAnahtar-Değer Çiftleri EklemeDeğerlere ErişmeBir Hash Map Üzerinde GezinmeBir Değeri GüncellemeBir Çifti KaldırmaÖzet - Kelime Sayacı11Son Meydan Okumalar
Özet - Benzersiz ÖğelerÖzet - Kullanıcı Profili DoğrulayıcıÖzet - Not Özetleyici3Komut Satırı Yapılacaklar Listesi
Proje KurulumuGörev EklemeTüm Görevleri GörüntülemeGörev SilmeFinal Kodu6'Option' ile Yokluğu Yönetme
'Option' Nedir?'Option' ile 'match' Kullanımıis_some() ve is_none()Bir 'Option' Değerini Açmak (Unwrapping)expect MetoduVarsayılan Değer Sağlama: unwrap_orÖzet - Bir Eleman Bulma9String Dilimleri ve Daha Fazlası
String ve &strString Dilimleri OluşturmaFonksiyon Parametresi Olarak DilimlerDiğer DilimlerÖzet - İlk Kelimeyi BulmaKendi başına pratik yap: Online Rust derleyicisi