我有这个代码使用.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()
此处用于快速处理错误。它可以用于任何返回Result
or的函数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)
归档时间: |
|
查看次数: |
9112 次 |
最近记录: |