繁体   English   中英

组成期权 <Enum> 与模式匹配参数的闭包

[英]Composing Option<Enum> with closures that pattern-match arguments

我有一个带有两个可能的“类型”的枚举和一个可能返回其中任何一个的函数,并包装在Option

enum Possibilities {
    First(i32),
    Second(String),
}
use Possibilities::*;

fn some_poss() -> Option<Possibilities> {
    Some(Second(String::from("hi")))
}

我想对some_poss的结果应用操作,但是此操作仅对枚举的一种可能有意义,否则应返回None 例如:

let a: Option<i32> = some_poss().and_then(|poss| if let First(x) = poss {
    Some(x * 2)
} else {
    None
});

如何简洁地结合此操作? 是否可以使用类似于以下内容的方式编写此代码?

// Compile error: pattern `Second(_)` not covered
let b: Option<i32> = some_poss().map(|First(x)| x * 2);

处理此特定情况的最佳方法是在enum上创建一种方法专门用于检索一个变体。 有点像Result::ok

enum Possibilities {
    First(i32),
    Second(String),
}
use Possibilities::*;

impl Possibilities {
    fn first(self) -> Option<i32> {
        match self {
            Possibilities::First(x) => Some(x),
            _ => None,
        }
    }
}

这将使您可以像以下方式实现功能:

some_fun().and_then(|p| p.first()).map(|x| x * 2)
// or, if you prefer this style:
some_fun().and_then(Possibilities::first).map(|x| x * 2);

这样可以明确每个步骤在做什么some_poss获取Option<Possiblities> some_poss Option<Possiblities> ,然后first()从该Possibilities获取Option<i32> ,然后and_then Option<Option<i32>>折叠为Option<i32>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM