惯用的方法来做最大的选项< number>在生 rust

zbq4xfa0  于 2022-11-12  发布在  其他
关注(0)|答案(3)|浏览(130)

我在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方法。你能帮我吗?

nhaq1z21

nhaq1z211#

使用map

fn max(a: Option<u32>, b: u32) -> Option<u32> {
    a.map(|v| std::cmp::max(v, b))
}

Playground
map_or,以预设未换行的词汇:

fn max(a: Option<u32>, b: u32) -> Option<u32> {
    a.map_or(Some(b), |v| Some(std::cmp::max(v, b)))
}

Playground
实际上不需要返回的Option

fn max(a: Option<u32>, b: u32) -> u32 {
    a.map_or(b, |v| std::cmp::max(v, b))
}
ar7v8xwq

ar7v8xwq2#

最大值:

T实作Ord时,Option<T>会实作Ord,因此可以像这样实作您的函式:

fn max(a: Option<u32>, b: u32) -> Option<u32> {
    std::cmp::max(a, Some(b))
}

Playground
请注意:
对于每一个T: OrdSome<T>都大于None,这满足了您的要求。
这一点没有记录在案,但我们可以证明:
因为Ord类型形成了total order.这意味着它们需要是可传递的;如果None小于Some(MIN),则None将小于集合(Option<T>)中的任何其它值,因为Some(MIN)小于集合中除None之外的任何值

assert!(Some(std::i64::MIN) > None);

最小值:

您还可以通过添加额外的or来扩展std::cmp::min,这也适用于max的情况,但这不是必需的,因为将有额外的检查和值b的额外副本来比较max的解。

fn min(a: Option<u32>, b: u32) -> Option<u32> {
    std::cmp::min(a.or(Some(b)), Some(b))
}

Playground

noj0wjuj

noj0wjuj3#

  • 对于那些函数式编程的书呆子来说 *

这是另一种使用单子属性的方法,这可能有助于理解单子,它允许给定一个Thing<A>,应用一个函数A -> Thing<B>,得到一个Thing<B>
第一个

相关问题