我有这个代码使用.unwrap():
fn main() {
let paths = std::fs::read_dir("/home/user").unwrap();
for path in paths {
println!("Name: {}", path.unwrap().path().display());
}
}
Run Code Online (Sandbox Code Playgroud)
看了之后的定义unwrap,
pub fn unwrap(self) -> T {
match self {
Ok(t) => t,
Err(e) => unwrap_failed("called `Result::unwrap()` on an `Err` value", e),
}
}
Run Code Online (Sandbox Code Playgroud)
pub fn read_dir<P: AsRef<Path>>(path: P) -> io::Result<ReadDir>
Run Code Online (Sandbox Code Playgroud)
我是否正确理解unwrap返回T传入的类型Result?
rod*_*igo 41
在Rust中,当你有一个可能返回T或失败的操作时,你将得到一个类型的值Result<T,E>或Option<T>(E如果有一个有趣的错误,将是错误条件).
如果有的话,该功能unwrap(self) -> T将为您提供嵌入式功能T.相反,如果不存在T,但一个E或None然后它会恐慌.
当您确定没有错误时,最好使用它.如果情况并非如此,通常情况下,模式匹配错误或使用try!宏运?算符转发错误会更好.
在您的示例中,调用read_dir()返回a,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);
}
}
Run Code Online (Sandbox Code Playgroud)
看看每个错误案例是如何检查的.
(更新为使用?而不是try!().宏仍然有效,但?新代码首选).
Yil*_*maz 14
问题是从文件中读取一行会产生潜在的错误类型。类型是
Result<String,std::io::Error>
Run Code Online (Sandbox Code Playgroud)
Result是一个枚举。结果中有两个潜在值,它们用于错误处理和管理。第一个值是Err. 如果填充 Err,则调用的函数中存在错误。另一个潜在的选择是Ok。Ok 包含一个值。
enum Result<T, E> {
Ok(T),
Err(E),
}
Run Code Online (Sandbox Code Playgroud)
枚举是一种“复杂类型”,而不是单个值。为了获得我们正在寻找的值,我们使用unwrap()解包该值。
unwrap()此处用于快速处理错误。它可以用于任何返回Resultor的函数Option(Option 也是枚举)。如果函数返回 Ok(value),您将获得该值。如果函数返回 Err(error),程序就会出现紧急情况。例如这会恐慌:
fn main() {
let result: Result<i32, &str> = Err("Unknown error");
let value = result.unwrap(); // This line will cause a panic because result is Err,
}
Run Code Online (Sandbox Code Playgroud)
恐慌是不可取的(在测试环境中使用是可以的)。最好使用match、if let、 或之类的方法unwrap_or()来优雅地处理成功和错误情况,从而允许更受控的错误处理而不会引起恐慌。例如:
fn main() {
let result: Result<i32, &str> = Err("Error occurred");
let value = match result {
Ok(val) => val, // If result is Ok, return the value
Err(err) => {
println!("Error: {}", err);
//returning a default value of 0
0
}
};
println!("here is the default value {}",value)
}
Run Code Online (Sandbox Code Playgroud)
或者
fn main() {
let result: Result<i32, &str> = Err("Error occurred");
let value = if let Ok(val) = result {
val // If result is Ok, return the value
} else {
println!("Error occurred"); // Handle the error case
// Return a default value or perform other error handling logic
// Here, returning a default value of 0
0
};
println!("here is the value {}",value)
}
Run Code Online (Sandbox Code Playgroud)