我的代码使用.unwrap()
:
fn main() {
let paths = std::fs::read_dir("/home/user").unwrap();
for path in paths {
println!("Name: {}", path.unwrap().path().display());
}
}
pub fn unwrap(self) -> T {
match self {
Ok(t) => t,
Err(e) => unwrap_failed("called `Result::unwrap()` on an `Err` value", e),
}
}
pub fn read_dir<P: AsRef<Path>>(path: P) -> io::Result<ReadDir>
我是否理解unwrap
会返回T
中传递的Result
类型?
答案 0 :(得分:29)
在Rust中,当您的操作可能返回T
或失败时,您将获得Result<T,E>
或Option<T>
类型的值(E
将是在有趣错误的情况下的错误条件。)
如果有的话,unwrap(self) -> T
函数会为您提供嵌入式T
。相反,如果没有T
而是E
或None
则会出现恐慌。
最好在您确定没有错误时使用。如果情况并非如此,通常情况下模式匹配错误或使用 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!()
。宏仍然有效,但新代码首选?
。