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 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.

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 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 &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 değerini 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

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 Ok değerini açar ve yürütmeye devam eder
  • Eğer bir hata oluşursa, mevcut fonksiyondan hemen bir Err dö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
}
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