Soru İşareti Operatörü '?'
Coddy'nin Rust Journey'sinin Logic & Flow bölümünün bir parçası — ders 46 / 66.
Result döndüren fonksiyonlarla çalışırken, hataları ya yerel olarak ele almanız ya da çağıran fonksiyona iletmeniz gerekir. Rust, bu yaygın desen için zarif bir operatör sunar: soru işareti operatörü ?.
? operatörü, ayrıntılı match ifadeleri yazmadan hataları yaymak için temiz bir yol sağlar. Bir Result değerinden sonra ? koyduğunuzda, otomatik olarak bir Ok değerini açar veya mevcut fonksiyondan Err ile 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, tam bir match ifadesi yazmaya eşdeğerdir, ancak çok daha kısa ve özdür. Eğer s.parse::<i32>() bir Ok döndürürse, ? değeri çıkarır ve number değişkenine atar. Eğer bir Err döndürürse, ? bu hatayı tüm fonksiyondan anında döndürür.
? operatörü, bir hata döndürebilmesi gerektiğinden, yalnızca bir Result (veya Option) döndüren fonksiyonlarda kullanılabilir.
Görev
Kolayİki girdi alacaksınız. İlk girdi, bir tam sayıya dönüştürülmesi gereken bir dizedir ve ikinci girdi de yine bir tam sayıya dönüştürülmesi gereken başka bir dizedir. Parametre olarak iki dize dilimi (string slice) alan ve bir Result<i32, std::num::ParseIntError> döndüren add_numbers adında bir fonksiyon oluşturun. Fonksiyonun içinde, her iki dizeyi de ayrıştırmak için ? operatörünü kullanın ve toplamlarını Ok içine sarılmış olarak döndürün. Fonksiyonu iki girdi ile çağırın ve sonucu match kullanarak işleyin.
Gereksinimler:
- İlk girdiyi (dize olarak ilk sayı) okuyun ve boşlukları temizleyin (trim)
- İkinci girdiyi (dize olarak ikinci sayı) okuyun ve boşlukları temizleyin (trim)
- İki
&strparametresi alan veResult<i32, std::num::ParseIntError>döndüren biradd_numbersfonksiyonu oluşturun - Fonksiyonun içinde,
?operatörünü kullanarak ilk dizeyii32türüne ayrıştırın ?operatörünü kullanarak ikinci dizeyii32türüne ayrıştırın- Ayrıştırılan her iki sayının toplamı olan
Ok(sum)değerini döndürün - Fonksiyonu iki girdi dizesiyle çağırın
Resultdeğerini işlemek için birmatchifadesi 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 bir dize (örneğin,
15) - İkinci satır: Başka bir sayıyı temsil eden bir dize (örneğin,
27)
Çıktı:
- Her iki dize de geçerli sayılarsa:
Sum: [result] - Dizelerden biri ayrıştırılamazsa:
Parsing error
Kopya kağıdı
Soru işareti operatörü ?, Result döndüren fonksiyonlarda hataları yaymak için kısa bir yol sağlar.
Bir Result değerinden sonra yerleştirildiğinde, ? operatörü:
- Bir
Okdeğerini açar ve yürütmeye devam eder - Eğer bir hata oluşursa, mevcut fonksiyondan hemen bir
Errdöndürür
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
}? operatörü yalnızca Result veya Option türü döndüren fonksiyonlarda kullanılabilir.
Kendin dene
use std::io;
// TODO: Burada add_numbers fonksiyonunu oluşturun
// İki adet &str parametresi almalı ve Result<i32, std::num::ParseIntError> döndürmelidir
fn main() {
// İlk girdiyi oku
let mut input1 = String::new();
io::stdin().read_line(&mut input1).expect("Failed to read line");
let input1 = input1.trim();
// İkinci girdiyi oku
let mut input2 = String::new();
io::stdin().read_line(&mut input2).expect("Failed to read line");
let input2 = input2.trim();
// TODO: input1 ve input2 ile add_numbers fonksiyonunu çağırın
// TODO: Result'ı işlemek için match kullanın
// Ok(value) için "Sum: [value]" yazdırın
// Err(_) için "Parsing error" yazdırın
}Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Logic & Flow 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 Bulma