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
中的值总是在程序执行之前进行评估?并且只有在程序执行到该行时才调用FnOnce
中的unwrap_or_else
值吗?
答案 0 :(得分:3)
两者均在程序执行期间求值,并且可以是任意值。区别在于:
unwrap_or
会在调用unwrap_or
之前评估后备值,因此会评估是否需要此值(因为Rust是一种急切的语言)。unwrap_or_else
时,仅当unwrap_or_else
触发后备值时(通过调用传递的函数)才评估后备值,因此仅在需要时才评估后备值。