使用 ok_or_else 方法将 Option<T> 转换成 Result<T, E>
发布日期:
在 Python 中,可以这样来处理错误:
try:
# code...
except:
# do some thing...
但是在 Rust 中没有对应的语法来处理错误。在 Rust 中,错误被视为和正确同等重要的地位,他们都表示了程序运行的状态。为了描述错两种状态,需要用到枚举 Result<T, E>
,处理错误,就等同于模式匹配 Result<T, E>
枚举。同样,在 Rust 中,没有空值,如果想要描述有无两种状态,需要用到枚举 Option<T>
。
在程序编写时,可用 .unwrap()
方法来快速获得值 T
,同时,当取到 Err
或 None
时,程序就会直接崩溃。然而,大多数情况下,得到 Err
或者 None
都不至于让程序崩溃。如果不想让程序崩溃,那每次都要进行模式匹配,人就要崩溃。还好,可用问号操作符 ?
在遇到 Err
或者 None
时,将其返回(传播)。但是问号操作符只能单独传播一种类型,当返回值是 Result<T, E>
时,只能传播 Err
,同样返回值是 Option<T>
时,只能传播 None
。
使用 .ok_or_else
方法可以将 Option<T>
转换成 Result<T, E>
,这就意味着,我们可以在取到 None 时,可以传播一个错误。下面,将举个例子加以说明,为了更简单的处理错误,本例使用了 anyhow 库(这个例子可能要以后再进行补充)。
[dependencies]
anyhow = "1.0"
use anyhow::{anyhow, Result};
let x = Some("foo");
assert_eq!(x.ok_or_else(|| anyhow!("failed to get value!")), Ok("foo"));