【问题标题】:How to flatten two Result [duplicate]如何展平两个结果[重复]
【发布时间】:2020-10-25 23:09:41
【问题描述】:

鉴于以下两个功能,我如何将两个Result“扁平化”为一个?

fn result1() -> Result<u8, String> {
  Ok(10)
}

fn result2(number: u8) -> Result<u8, String> {
  Ok(number * 2)
}

所以,运行以下代码:

fn main() {
    let result = result1().map(|number| result2(number));
    println!("{:?}", result);
    // Output: Ok(Ok(20))
}

我得到与这段代码相同的结果:

fn main() {
    let result = result1().map(|number| number * 2);
    println!("{:?}", result);
    // Output: Ok(20)
}

注意嵌套的 Ok Ok(Ok(20)) 而不是正确的单个 Ok Ok(20)

类似于我正在寻找的东西是 Rx flatmap,但是当我正在研究 rust 时,我想使用语言思维来完成这项工作。

【问题讨论】:

    标签: rust


    【解决方案1】:

    您正在寻找Result::and_then:

    fn main() {
        let result = result1().and_then(result2);
        println!("{:?}", result);
        // Output: Ok(20)
    }
    

    【讨论】:

    • 谢谢,我之前没有尝试过and_then,因为它的行为与Rxs andThen完全不同。这是学习一门新语言的一件好事 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    • 2010-12-17
    • 2012-09-23
    • 1970-01-01
    • 2018-07-06
    相关资源
    最近更新 更多