什么是Rust的解包,它用于什么?

时间:2016-04-01 17:07:27

标签: rust

我的代码使用.unwrap()

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

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

    }
}

查看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),
    }
}

signature of read_dir

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

我是否理解unwrap会返回T中传递的Result类型?

1 个答案:

答案 0 :(得分:29)

在Rust中,当您的操作可能返回T或失败时,您将获得Result<T,E>Option<T>类型的值(E将是在有趣错误的情况下的错误条件。)

如果有的话,unwrap(self) -> T函数会为您提供嵌入式T。相反,如果没有T而是ENone则会出现恐慌。

最好在您确定没有错误时使用。如果情况并非如此,通常情况下模式匹配错误或使用 try! ?运算符转发错误会更好。

在您的示例中,对read_dir()的调用返回io::Result<ReadDir>,因为打开目录可能会失败。迭代打开的目录会返回多个io::Result<DirEntry>类型的值,因为读取目录可能也会失败。

使用 try! ?,它会是这样的:

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

    for entry in entries {
        println!("Name: {}", entry?.path().display());

    }
    Ok(())
}

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

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

查看每个错误案例的检查方式。

(已更新为使用?而不是try!()。宏仍然有效,但新代码首选?