【问题标题】:Why choosing `unwrap_or_else` over `unwrap_or`? [duplicate]为什么选择 `unwrap_or_else` 而不是 `unwrap_or`? [复制]
【发布时间】:2019-06-23 18:07:46
【问题描述】:
fn main() {
    let _one = None.unwrap_or("one".to_string());
    let _two = None.unwrap_or_else(|| "two".to_string());
}

人们应该更喜欢unwrap_or_else 而不是unwrap_or 的任何特定原因?

我见过unwrap_or 渴望的cmets(以this 为例)。这是否意味着unwrap_or 中的值总是在程序执行之前进行评估?而unwrap_or_else 中的FnOnce 值只有在程序执行到该行时才被调用?

【问题讨论】:

  • 这是一个调用,所以参数总是被评估。 unwrap_or_else 的文档也说了这么多。
  • 为什么布尔条件句使用|| 而不是|?它们都可以工作,但|| 具有明显的优势。
  • @SilvioMayolo 是称为FnOnce 的闭包,不是布尔值? doc.rust-lang.org/std/option/…
  • @Jason 抱歉,如果我的评论不清楚。我并不是在暗示上面代码中的|| 是一个布尔值或。我的意思是在|, ||unwrap_orunwrap_or_else 之间的关系之间进行类比。即两对中的后者短路。
  • @Jason 没错!听起来你做对了。

标签: performance rust unwrap


【解决方案1】:

两者都在程序执行期间进行评估,可以是任意值。不同的是:

  • 使用unwrap_or,在调用unwrap_or 之前评估回退值,因此评估它是否需要(因为Rust 是一种急切的语言)。
  • 对于unwrap_or_else,回退值仅在unwrap_or_else 触发(通过调用您传递的函数)时评估,因此仅在需要时评估。

【讨论】:

  • 让 _two = None.unwrap_or_else(|| "two".to_string());对我不起作用,但让 _two = None.unwrap_or_else(| _ | "two".to_string());知道为什么吗?
猜你喜欢
  • 2012-11-12
  • 2016-04-24
  • 2023-04-08
  • 2017-09-27
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 2014-08-05
相关资源
最近更新 更多