我刚刚在拉取请求中看到以下更改:
- .ok_or(Error::new(ErrorKind::Other, "Decode error"));
+ .ok_or_else(|| Error::new(ErrorKind::Other, "Decode error"));
我知道的唯一区别是:
- In
ok_or
我们已经创建了Error
by Error::new
并将其传递到适配器中。
- In
ok_or_else
我们已经传递了一个闭包,它将产生这样的值,但如果有的话它可能不会被调用Some
数据在Option
.
我错过了什么吗?
使用的主要原因ok_or_else
or any of the ..._or_else
方法是为了避免在不需要时执行函数。如果是Option::ok_or_else
or Option::unwrap_or_else
,当Option
is Some
。这可以使代码更快,具体取决于错误情况下发生的情况
在这个例子中,Error::new
可能执行分配,但它也可以写入标准输出、发出网络请求或任何 Rust 代码可以执行的任何操作;从外面很难看出。通常将此类代码放在闭包中更安全,因此当成功案例发生时,您不必担心无关的副作用。
Clippy 也为您提供了以下信息:
fn main() {
let foo = None;
foo.unwrap_or("hello".to_string());
}
warning: use of `unwrap_or` followed by a function call
--> src/main.rs:3:9
|
3 | foo.unwrap_or("hello".to_string());
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `unwrap_or_else(|| "hello".to_string())`
|
= note: `#[warn(clippy::or_fun_call)]` on by default
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#or_fun_call
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)