Menu
Coddy logo textTech

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.

challenge icon

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_numbers parametresi alan ve &str döndüren bir Result<i32, std::num::ParseIntError> işlevi oluşturun
  • İşlevin içinde, i32 işlecini kullanarak ilk dizeyi ? türüne ayrıştırın
  • İkinci dizeyi i32 iş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
  • match değerini işlemek için bir Result ifadesi kullanın
  • Ok(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(_)
}
quiz iconKendini test et

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

Kendi başına pratik yap: Online Rust derleyicisi