【问题标题】:Unraveling a match statement with monads用 monad 解开 match 语句
【发布时间】:2016-01-07 17:58:27
【问题描述】:

我正在尝试简化以下代码:

fn foo(a: i32) -> Option<i32> {
    match bar() {
        None => None,
        Some(strct) => match strct.field {
            None => None,
            Some(field) => Some(a * field),
        }
    }
}

这就是我到目前为止所取得的成就。它可以工作,但我不知道如何删除unwrap() 调用以使其在功能上与原始版本相同。

fn foo(a: i32) -> Option<i32> {
    bar().and_then(|strct| Some(a * strct.field.unwrap()))
}

P.S.:您如何建议对做这类事情有直觉?我经常在使用 Rust 时遇到这些问题,而且总是很困难。

【问题讨论】:

    标签: error-handling rust


    【解决方案1】:

    这里你应该使用 map 而不是 unwrap。

    fn foo(a: i32) -> Option<i32> {
        bar().and_then(|s| s.field.map(|f| a * f))
    }
    

    至于培养直觉,这需要时间。继续阅读和编写 rust 代码(以及其他函数式语言的代码),这种直觉就会到来。

    【讨论】:

      猜你喜欢
      • 2021-06-12
      • 1970-01-01
      • 2013-05-16
      • 2022-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-25
      • 1970-01-01
      相关资源
      最近更新 更多