Bu soru işareti operatörü ne hakkında?


Yanıtlar:


145

Fark etmiş olabileceğiniz gibi, Rust'un istisnaları yok. Paniklere sahiptir, ancak işlevleri sınırlıdır (yapılandırılmış bilgileri taşıyamazlar) ve hata işleme için kullanımları önerilmez (kurtarılamaz hatalar içindir).

Rust'ta hata işleme kullanır Result. Tipik bir örnek şöyle olabilir:

fn halves_if_even(i: i32) -> Result<i32, Error> {
    if i % 2 == 0 {
        Ok(i / 2)
    } else {
        Err(/* something */)
    }
}

fn do_the_thing(i: i32) -> Result<i32, Error> {
    let i = match halves_if_even(i) {
        Ok(i) => i,
        Err(e) => return Err(e),
    };

    // use `i`
}

Bu harika çünkü:

  • kodu yazarken yanlışlıkla hata ile uğraşmayı unutamazsınız,
  • Kodu okurken hemen burada bir hata olasılığı olduğunu hemen görebilirsiniz.

İdeal olmaktan çok daha az, ancak çok ayrıntılı. Soru işareti operatörünün ?devreye girdiği yer burasıdır .

Yukarıdakiler şu şekilde yeniden yazılabilir:

fn do_the_thing(i: i32) -> Result<i32, Error> {
    let i = halves_if_even(i)?;

    // use `i`
}

ki bu çok daha özlü.

?Burada ne anlama geliyor matchyukarıdaki ifadeye eşdeğerdir . Kısaca: Resulteğer OK paketini açar ve değilse hatayı döndürür .

Bu biraz sihirdir, ancak hata işleme, standart metnin kesilmesi için biraz sihre ihtiyaç duyar ve istisnaların aksine, hangi işlev çağrılarının hata yapıp yapmayacağı hemen görülebilir: süslenmiş olanlar ?.

Büyünün bir örneği, bunun da şunlara yaramasıdır Option:

// Assume
// fn halves_if_even(i: i32) -> Option<i32>

fn do_the_thing(i: i32) -> Option<i32> {
    let i = halves_if_even(i)?;

    // use `i`
}

Bu, (kararsız) Tryözellik tarafından desteklenmektedir .

Ayrıca bakınız:


5
Cevabınızı biraz uzatırsanız iyi olur, örneğin, işlevin dönüş türünün "çözmeyi" denediğiniz türle eşleşmesi gerektiğini tartışın, örneğin Resultveya Option.
merhaba

@hellow Sanırım bu tamamen yeni bir soru olsa iyi olur
Paul Razvan Berg

2

Kurtarılabilir hata tipi Sonuç <T, E> için hata yayılımı içindir. Sonucu çözer ve size içsel değeri verir.

Hata durumunu ele almak yerine, onu arayan koduna yayarsınız ve yalnızca Tamam durumuyla ilgilenirsiniz. Bunun faydası, çok sayıda standart metni ortadan kaldırması ve işlevin uygulanmasını daha basit hale getirmesidir.


.unwrap()Bir hata durumunda hangi paniğe kapılacağı ile karıştırılmamalıdır .
Ürdün
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.