Menu
Coddy logo textTech

Kısayollar: unwrap ve expect

Coddy'nin Rust Journey'sinin Logic & Flow bölümünün bir parçası — ders 45 / 66.

Daha önce Option ile .unwrap() ve .expect() metotlarını öğrenmiştiniz ve bu aynı metotlar Result ile de çalışır. Ancak, başarı ve hata durumlarıyla ilgilenirken davranışları biraz farklıdır.

.unwrap() metodu, bir Ok varyantından değeri çıkarır, ancak Result bir Err ise programınız panikleyecek ve çökecektir. Benzer şekilde, .expect() de aynı şeyi yapar ancak hata ayıklamayı kolaylaştıran özel bir panik mesajı sağlamanıza olanak tanır:

let success: Result = Ok(42);
let value = success.expect("This should work!");
println!("Value: {}", value); // Şunu yazdırır: Value: 42

// Bu, özel mesajla panikleyecektir:
// let failure: Result = Err("Something went wrong");
// let value = failure.expect("This should work!"); // Panikler!

Bu yöntemler başarılı değerlere hızlı erişim sağlasa da, dikkatli kullanılmalıdırlar. İşlemin başarılı olacağından kesinlikle emin olduğunuzda veya geliştirme ve test aşamalarında en uygundurlar.

challenge icon

Görev

Kolay

İki girdi alacaksınız. İlk girdi bir sayı (dize olarak) ve ikinci girdi bir durum göstergesidir (ok veya error). Duruma göre bir Result<i32, &'static str> oluşturun. Eğer durum ok ise, ayrıştırılmış sayıyı içeren bir Ok oluşturun. Eğer durum error ise, "Invalid operation" mesajını içeren bir Err oluşturun. Result içinden değeri çıkarmak için özel bir mesajla .expect() kullanın ve sonucu yazdırın.

Gereksinimler:

  • İlk girdiyi (sayı) okuyun ve boşlukları temizleyin
  • İlk girdiyi i32 türüne ayrıştırın
  • İkinci girdiyi (durum) okuyun ve boşlukları temizleyin
  • Bir Result<i32, &'static str> değişkeni oluşturun:
    • Eğer durum ok ise, Ok(parsed_number) atayın
    • Eğer durum error ise, Err("Invalid operation") atayın
  • Result içinden değeri çıkarmak için .expect("Failed to get value") kullanın
  • Çıkarılan değeri şu formatta yazdırın: Value: [value]

Girdi:

  • İlk satır: Bir sayı (örneğin, 75)
  • İkinci satır: ok veya error

Çıktı:

  • Eğer durum ok ise: Value: [number]
  • Eğer durum error ise: Program özel mesajla panikleyecektir (bu görevde test edilmemiştir)

Not: Bu görev için, test senaryoları başarılı yürütmeyi sağlamak adına yalnızca ok durumunu kullanacaktır. error durumu, bir Err ile karşılaşıldığında .expect() metodunun beklenen davranışı olan bir paniğe (panic) neden olur.

Kopya kağıdı

.unwrap() ve .expect() metotları, Ok varyantından değerleri çıkarmak için Result türleriyle birlikte çalışır.

.unwrap(), bir Ok içerisinden değeri çıkarır, ancak Result bir Err ise panikler:

let success: Result<i32, &str> = Ok(42);
let value = success.unwrap();
println!("Value: {}", value); // Şunu yazdırır: Value: 42

.expect() aynı şekilde çalışır ancak daha kolay hata ayıklama için özel bir panik mesajı sağlamanıza olanak tanır:

let success: Result<i32, &str> = Ok(42);
let value = success.expect("This should work!");
println!("Value: {}", value); // Şunu yazdırır: Value: 42

// Bu, özel mesajla panikleyecektir:
let failure: Result<i32, &str> = Err("Something went wrong");
let value = failure.expect("This should work!"); // Özel mesajla panikler

Bu metotlar dikkatli kullanılmalıdır, çünkü Result bir Err ise programınızı çökertecektir. İşlemin başarılı olacağından emin olduğunuzda veya geliştirme ve test aşamalarında en uygundurlar.

Kendin dene

use std::io;

fn main() {
    // İlk girişi oku (sayı)
    let mut number_input = String::new();
    io::stdin().read_line(&mut number_input).expect("Failed to read line");
    let number_input = number_input.trim();
    
    // Sayıyı i32'ye dönüştür
    let parsed_number: i32 = number_input.parse().expect("Failed to parse number");
    
    // İkinci girişi oku (durum)
    let mut status = String::new();
    io::stdin().read_line(&mut status).expect("Failed to read line");
    let status = status.trim();
    
    // TODO: Kodunuzu aşağıya yazın
    // Duruma göre bir Result<i32, &'static str> oluşturun
    // Değeri çıkarmak için .expect() kullanın
    // Sonucu şu formatta yazdırın: Value: [value]
    
}
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