为什么选择 `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
触发它时(通过调用您传递的函数)进行评估,因此仅在需要时进行评估。
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
触发它时(通过调用您传递的函数)进行评估,因此仅在需要时进行评估。