2016-04-01 10 views
6

Mam ten kod, który wykorzystuje .unwrap():Co jest rozwijane w Rust i do czego służy?

fn main() { 
    let paths = std::fs::read_dir("/home/user").unwrap(); 

    for path in paths { 
     println!("Name: {}", path.unwrap().path().display()); 

    } 
} 

Po patrząc na definition of unwrap,

pub fn unwrap(self) -> T { 
    match self { 
     Ok(t) => t, 
     Err(e) => unwrap_failed("called `Result::unwrap()` on an `Err` value", e), 
    } 
} 

A signature of read_dir

pub fn read_dir<P: AsRef<Path>>(path: P) -> io::Result<ReadDir> 

mam rację w zrozumieniu, że unwrap zwraca T typ przekazywany w Result?

+1

Zobacz także [Co to jest ta rzecz) (http://stackoverflow.com/q/21257686/155423) i może [Jaka jest korzyść z używania wyniku?] (Http://stackoverflow.com/q/ 22187926/155423). – Shepmaster

+0

@Shepmaster dzięki za bardzo przydatny link i przepraszam za mój angielski –

+0

Nie trzeba przepraszać za słaby angielski; dopóki ktoś jest w stanie zrozumieć pytanie, możemy je wyczyścić. Pamiętaj, aby wyszukać poprzednie pytania i wyjaśnić, dlaczego Twoje pytanie nie jest ich duplikatem. – Shepmaster

Odpowiedz

12

w Rust, kiedy masz operację, która może albo powrócić do T lub nie, będzie mieć wartość typu Result<T,E> lub Option<T> (E będzie warunek błędu w przypadku ciekawej błędu).

Funkcja unwrap(self) -> T wyświetli wbudowany T, jeśli taki istnieje. Jeśli zamiast tego nie ma numeru T, ale E lub None, nastąpi panika.

Najlepiej używać go, gdy masz pewność, że nie masz błędu. Jeśli tak nie jest, to zazwyczaj lepiej jest dopasować wzór do błędu lub użyć makra try!, aby przekazać błąd.

W tym przykładzie wywołanie read_dir() zwraca io::Result<ReadDir>, ponieważ otwarcie katalogu może się nie powieść. Iterowanie otwartego katalogu zwraca wiele wartości typu io::Result<DirEntry>, ponieważ odczytanie katalogu może również się nie powieść.

Z try! byłoby coś takiego:

fn main2() -> std::io::Result<()> { 
    let paths = try!(std::fs::read_dir("/home/user")); 

    for path in paths { 
     println!("Name: {}", try!(path).path().display()); 

    } 
    Ok(()) 
} 

fn main() { 
    let res = main2(); 

    if let Err(e) = res { 
     println!("Error: {}", e); 
    } 
} 

Spójrz jak jest zaznaczone każdy przypadek błędu.

+0

dziękuję za poświęcony czas i bardzo dziękuję za przykład –