为什么选择 `unwrap_or_else` 而不是 `unwrap_or`?

Why choosing `unwrap_or_else` over `unwrap_or`?

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急切(以this为例)。这是否意味着 unwrap_or 中的值总是在程序执行之前计算?而 unwrap_or_else 中的 FnOnce 值仅在程序执行到该行时被调用?

两者都是在程序执行期间计算的,可以是任意值。区别在于:

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