在什么情况下 `..._or()` 比 `..._or_else(|| {})` 更好,为什么?

Ale*_*lia 2 lazy-evaluation rust rust-clippy

如果变体仅在需要时..._or_else()执行

// example
let value = option.unwrap_or_else(|| compute_value(argument));
// only executed if `option` is of enum variant Option::None
Run Code Online (Sandbox Code Playgroud)

那么有没有什么情况是..._or()有优势的呢?

我的理解是,如果里面的结果..._or_else()已经计算出来了,那么using..._or()就可以毫无缺陷地使用。但这种情况有什么好处吗?

..._or_else()我尝试过情况并发现了建议从 更改为 的Clippy 规则..._or(),但我很难理解该规则的原因:

为什么这样不好?

在某些情况下,使用即时求值会更短、更简单。

已知问题

Deref 和 Index 有可能产生副作用,但不建议这样做。急切地评估>它们可以改变程序的语义。

caf*_*e25 9

使用*_or而不是*_or_else当您已经有该值时可以节省至少 7 个字符(_else可能||更多 {}),因此噪音更少。

\n

它还会导致创建更少的闭包\xe2\x80\x94,这对于新的 Rustacean 或另一种编程语言的开发人员来说可能是未知或不熟悉的语法\xe2\x80\x94是否会在性能或编译时间上产生可测量的差异我不知道当然可以,但是对于编译器和阅读代码的人来说,这肯定会减少工作量。

\n

  • 通过优化,它们至少在基本情况下编译为完全相同的代码([godbolt](https://godbolt.org/z/fv8TP4c1j))。然而,在调试模式下,“*_or”版本要短得多,而且几乎肯定更快。 (2认同)