Menu
Coddy logo textTech

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 alarak ya da çağıran fonksiyona ileterek yönetmeniz 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 Err ile mevcut fonksiyondan 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 yazmakla 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 hemen döndürür.

::<i32> sözdizimine dikkat edin — buna turbofish denir ve Rust'a dizeyi hangi türe ayrıştıracağını söyler. Fonksiyon Result<i32, std::num::ParseIntError> döndürür; burada i32 başarı türüdür ve std::num::ParseIntError ise ayrıştırma başarısız olduğunda döndürülen hata türüdür.

? operatörü, bir hata döndürebilmesi gerektiğinden yalnızca bir Result (veya Option) döndüren fonksiyonlarda kullanılabilir.

challenge icon

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 girdiyle ç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 &str parametresi alan ve Result<i32, std::num::ParseIntError> döndüren bir add_numbers fonksiyonu oluşturun
  • Fonksiyonun içinde, ? operatörünü kullanarak ilk dizeyi i32 türüne ayrıştırın
  • ? operatörünü kullanarak ikinci dizeyi i32 tü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
  • Result sonucunu işlemek için bir match 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 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

Kendin dene

use std::io;

// TODO: add_numbers fonksiyonunu burada 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 değerini işlemek için match kullanın
    // Ok(value) için "Sum: [value]" yazdırın
    // Err(_) için "Parsing error" yazdırın
}
quiz iconKendini test et

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