Result

Result, Option tipinin olası yokluk yerine hatayı açıklayan daha zengin versiyonudur.

Yani, Result<T, E> iki sonuçtan birine sahip olabilir:

  • Ok(T): T öğesi bulundu.
  • Err(E): E öğesi ile ilgili bir hata bulundu.

Geleneksel olarak, beklenen sonuç Ok iken beklenmedik sonuç Err'dir.

Option gibi, Result'ın da kendisiyle ilişkili birçok metodu vardır. Örneğin unwrap(), ya T öğesini ya da panic'i oluşturur. Durum ele alma işlemi için Result ve Option örtüşen birçok birleştirici vardır.

Rust ile çalışırken, parse() metodu gibi Result türünü döndüren metotlarla karşılaşmanız pek mümkündür. Bir string'i diğer bir türe ayrıştırmak her zaman mümkün olmayabilir, bu nedenle parse() olası başarısızlığı gösteren bir Result döndürür.

Hadi başarılı ve başarısız şekilde parse() metoduna bakalım:

fn multiply(first_number_str: &str, second_number_str: &str) -> i32 {
    // Let's try using `unwrap()` to get the number out. Will it bite us?
    let first_number = first_number_str.parse::<i32>().unwrap();
    let second_number = second_number_str.parse::<i32>().unwrap();
    first_number * second_number
}

fn main() {
    let twenty = multiply("10", "2");
    println!("double is {}", twenty);

    let tt = multiply("t", "2");
    println!("double is {}", tt);
}

Başarısız durumda, parse(), unwrap() metodunun panic çağırmaması için bizi bir hatayla bırakır. Ek olarak, panic programımızdan çıkar ve hoş olmayan bir hata mesajı verir.

Hata mesajımızın kalitesini artırmak için, dönüş türü hakkında daha spesifik olmalı ve hatayı açıkça ele almalıyız.

Resultmain içinde kullanmak

Result türü, açıkça belirtilmişse main'in dönüş türü de olabilir. Tipik olarak main şu biçimde olacaktır:

fn main() {
    println!("Hello World!");
}

Bununla birlikte, main, bir Result türüne de sahip olabilir. Eğer bir hata oluşursa, main fonksiyonunun içinde bir hata kodu oluşturur ve hatanın debug temsilini yazdırır. (Debug niteliğini kullanarak). Takip eden örnekte, böyle bir senaryoyu gösterir ve takip eden bölümde ele alınan hususlara değinir.

use std::num::ParseIntError;

fn main() -> Result<(), ParseIntError> {
    let number_str = "10";
    let number = match number_str.parse::<i32>() {
        Ok(number)  => number,
        Err(e) => return Err(e),
    };
    println!("{}", number);
    Ok(())
}