unwrap_or
和 unwrap_or_else
都是用于从 Result
对象中获取值的宏。
当 Result
对象是 Ok
时,两者都会返回 Ok
中的值。但是当 Result
对象是 Err
时,两者的行为不同:
unwrap_or
将返回一个默认值。这个默认值是宏的参数,在调用unwrap_or
时就已经确定了。unwrap_or_else
将调用一个闭包,并返回闭包的结果。这个闭包是宏的参数,在调用unwrap_or_else
时就已经确定了。
所以,当你想要在 Err
时使用固定的默认值时,就可以使用 unwrap_or
;而当你想要在 Err
时使用可变的值时,就可以使用 unwrap_or_else
。
示例代码:
let x: Result<i32, &str> = Err("error message");
// 使用 unwrap_or 返回默认值
let y = x.unwrap_or(0);
// 使用 unwrap_or_else 返回闭包的结果
let z = x.unwrap_or_else(|| {
println!("error message: {}", x.unwrap_err());
0
});