我刚刚在pull请求中看到了以下更改:

- .ok_or(Error::new(ErrorKind::Other, "Decode error"));
+ .ok_or_else(|| Error::new(ErrorKind::Other, "Decode error"));

我所知道的唯一区别是:

  1. ok_or中,我们已经创建了Error×Error::new,并将其传递到适配器中.
  2. ok_or_else中,我们通过了一个闭包,该闭包将产生这样一个值,但如果Option中有Some个数据,则可能不会调用该闭包.

我错过什么了吗?

推荐答案

使用..._or_else个方法中的ok_or_else个或any个的主要原因是避免在不需要的时候执行函数.在Option::ok_or_elseOption::unwrap_or_else的情况下,当OptionSome时,不需要运行额外的代码.这可以使代码更快,这取决于错误情况下发生的情况

在本例中,Error::new可能执行分配,但它也可以写入标准输出、发出网络请求,或者任何一段 rust 迹代码都可以执行的操作;从外面很难分辨.通常,将这样的代码放在闭包中更安全,这样在成功 case 发生时就不必担心额外的副作用.

Clippy lints也为你准备了这个:

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

Rust相关问答推荐

我如何在Rust中使用传递依赖中的特征?

RUST应用程序正在退出,错误代码为:(退出代码:0xc0000005,STATUS_ACCESS_VIOLATION)

一种随机局部搜索算法的基准(分数)

为什么铁 rust S的默认排序功能比我对小数组的 Select 排序稍微慢一些?

为什么';t std::cell::ref使用引用而不是非空?

如何使用RefCell::JOYMOMTborrow 对 struct 不同字段的可变引用

关于 map 闭合求和的问题

如何防止Cargo 单据和Cargo 出口发布( crate )项目

Rust移动/复制涉及实际复制时进行检测

如何实现Deref;多次;?

为什么我需要 to_string 函数的参考?

找不到 .has_func 或 .get_func 的 def

如何对一个特征的两个实现进行单元测试?

如何为整数切片定义一个带有额外函数的特性别名?

str 和 String 的 Rust 生命周期

如何判断服务器是否正确接收数据

在运行时在 Rust 中加载字体

产生拥有值的迭代器的 Rust 可变borrow 在循环中失败

使用 `clap` 在 Rust CLI 工具中设置布尔标志

有没有办法使用 NASM 语法进行内联汇编?