我在Option
中有一个数字。我需要用它的最大值和其他值来替换它,或者如果我的数字是None
,就使用其他值。
我编写了一个函数来实现这一点:
fn max(a: Option<u32>, b: u32) -> Option<u32> {
if a.is_some() {
Some(std::cmp::max(a.unwrap(), b))
} else {
Some(b)
}
}
但是我一直在想,有一种更好的简洁的方法可以做到这一点,使用Option
方法。你能帮我吗?
3条答案
按热度按时间nhaq1z211#
使用
map
:Playground
或
map_or
,以预设未换行的词汇:Playground
实际上不需要返回的
Option
:ar7v8xwq2#
最大值:
当
T
实作Ord
时,Option<T>
会实作Ord
,因此可以像这样实作您的函式:Playground
请注意:
对于每一个
T: Ord
,Some<T>
都大于None
,这满足了您的要求。这一点没有记录在案,但我们可以证明:
因为
Ord
类型形成了total order.这意味着它们需要是可传递的;如果None
小于Some(MIN)
,则None
将小于集合(Option<T>
)中的任何其它值,因为Some(MIN)
小于集合中除None
之外的任何值最小值:
您还可以通过添加额外的
or
来扩展std::cmp::min
,这也适用于max
的情况,但这不是必需的,因为将有额外的检查和值b
的额外副本来比较max
的解。Playground
noj0wjuj3#
这是另一种使用单子属性的方法,这可能有助于理解单子,它允许给定一个
Thing<A>
,应用一个函数A -> Thing<B>
,得到一个Thing<B>
:第一个