yoklateknik mülakat

Backend Rs Error Handling Result Option Mülakat Soruları

75 doğrulanmış Backend Rs Error Handling Result Option mülakat sorusu — cevaplarıyla çöz, açıklamalarıyla öğren, gerçek simülasyonda kendini test et.

Gerçek simülasyonu dene →

Örnek sorular

Rs Error Handling Result OptionZorluk 1
fn save() -> Result<(), String> {
    Err("disk full".to_string())
}

fn main() {
    save();
    println!("done");
}

Bu kod cargo run ile derlenip çalıştırıldığında ne olur?
  • aDerleme durur: save()'in döndürdüğü Result ya match edilmeli ya da ? ile yayılmalıdır
  • bDerlenir, çünkü kullanılmayan Result yalnızca uyarıdır, sonra done basar
  • cTemiz derlenir ve çalışma zamanında disk full mesajıyla panic eder
  • dTemiz derlenir ve done basar; Rust'ta bir Result'ı yok saymak sessizdir
Açıklama:Result #[must_use] ile işaretlidir; incelemeden düşürülünce unused Result that must be used uyarısı çıkar. Uyarı hata değildir: binary derlenir, save() çalışır, Err değeri atılır ve done basılır. Panic olmaz, çünkü bir Err değeri ancak üzerinde unwrap/expect çağrılırsa panic eder.
Rs Error Handling Result OptionZorluk 2
fn first(v: &[i32]) -> Result<i32, String> {
    let x = v.first()?;
    Ok(*x)
}

Derleyici bu fonksiyon hakkında ne der?
  • aDerlenir; Result dönen fonksiyonda Option üzerindeki ?, NoneErr(String::new())'e çevirir
  • bDerlenir; slice boşken ? Err("None".to_string()) döndürür
  • cE0308 ile başarısız olur, çünkü v.first() Option<&i32> dönerken x i32 olarak kullanılıyor
  • dE0277 ile başarısız olur: Result dönen bir fonksiyonda Option üzerinde ? kullanılamaz
Açıklama:? operatörü içinde bulunduğu fonksiyonun dönüş tipine bağlıdır. Result dönen fonksiyonda ? yalnızca Result değerlerini kabul eder; v.first() (bir Option<&i32>) üzerine uygulanınca E0277 çıkar: "the ? operator can only be used on Results, not Options, in a function that returns Result". Çözüm v.first().ok_or_else(|| "empty".to_string())?. Rust None'dan kendiliğinden bir hata değeri üretmez.
Rs Error Handling Result OptionZorluk 1
fn main() {
    let n: i32 = "1".parse()?;
    println!("{}", n);
}

Bu kod neden derlenmez?
  • a? içinde bulunduğu fonksiyonun Result ya da Option dönmesini ister, ama bu main () dönüyor
  • b? parse()'a uygulanamaz: hata tipi Box<dyn Error> değildir
  • c? main içinde yasaktır; yalnızca main'in çağırdığı fonksiyonlar kullanabilir
  • d? hata tipini seçmek için parse::<i32>() gibi açık bir tip notu ister
Açıklama:Hata E0277: "the ? operator can only be used in a function that returns Result or Option". ? erken bir return Err(From::from(e))'ye açılır; fonksiyon () dönerken bu mümkün değildir. İmzayı fn main() -> Result<(), Box<dyn std::error::Error>> yapıp sonuna Ok(()) eklemek derlenmesini sağlar. main içinde ? serbesttir ve let n: i32 notu parse hedefini zaten belirlemiştir.
Rs Error Handling Result OptionZorluk 2
fn main() {
    let cfg: Option<&str> = None;
    let v = cfg.unwrap();
    println!("{}", v);
}

Çalışma zamanında ne gözlenir?
  • aProgram boş bir satır basar: None üzerinde unwrap tipin varsayılan değerini verir
  • bstderr'e Error: None yazıp 1 çıkış koduyla biter
  • cThread called Option::unwrap() on a None value mesajıyla panic eder ve süreç 101 koduyla çıkar
  • dDerleme başarısız olur: durumu bilinmeyen bir Option üzerinde unwrap reddedilir
Açıklama:Option::unwrap Some için iç değeri döndürür, None için tam olarak called Option::unwrap() on a None value mesajıyla panic eder. Ana thread'de yakalanmayan panic süreci 101 çıkış koduyla bitirir. Derleyici değerin None olup olmadığını izlemez; varsayılan değer yalnızca unwrap_or_default ile gelir, Error: ... satırı ve 1 kodu ise main'in Err dönmesinin ürünüdür, panic'in değil.
Rs Error Handling Result OptionZorluk 2
fn main() {
    let r: Result<i32, String> = Err("disk full".to_string());
    let v = r.expect("reading config");
    println!("{}", v);
}

Bu kod hangi panic mesajını üretir?
  • areading config
  • bcalled Result::unwrap() on an Err value: "disk full"
  • creading config: "disk full"
  • ddisk full: reading config
Açıklama:Result::expect(msg) özel mesajı, ardından iki nokta ve hatanın Debug gösterimini yazarak panic eder: reading config: "disk full". Tırnaklar String'in Debug çıktısından gelir. Düz unwrap() ise called Result::unwrap() on an Err value: "disk full" basardı. Özel metin her zaman başta gelir ve hiçbir zaman atılmaz.
Rs Error Handling Result OptionZorluk 2
fn parse(s: &str) -> Result<i32, String> {
    s.parse::<i32>().map_err(|e| format!("bad input {:?}: {}", s, e))
}

fn main() {
    println!("{:?}", parse("4x"));
}

Ne basılır?
  • aErr("bad input \"4x\": invalid digit found in string")
  • bErr("bad input 4x: ParseIntError { kind: InvalidDigit }")
  • cErr(ParseIntError { kind: InvalidDigit })
  • dOk(4), çünkü parse baştaki rakamları okuyup x'te durur
Açıklama:map_err hata tipini değiştirir: closure ParseIntError alır ve String döndürür, böylece fonksiyon Result<i32, String> verir. Closure içinde s üzerindeki {:?} tırnak ekler ("4x"), hata üzerindeki {} ise Display metnini (invalid digit found in string) kullanır. Dıştaki {:?} String'i kaçış karakterli tırnaklarla basar. str::parse sonda artık karakter kabul etmez; "4x" kısmi Ok(4) değil, tam bir hatadır.

3750 soruluk Backend bankasında kendini sına.

Mülakata başla