gpt4 book ai didi

enums - 使用模式匹配参数的闭包组合 Option

转载 作者:行者123 更新时间:2023-11-29 08:06:15 26 4
gpt4 key购买 nike

我有一个包含两种不同可能“类型”的枚举和一个可以返回其中任何一种的函数,封装在 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> , 然后 first()得到一个 Option<i32>来自那个Possibilities , 然后 and_then折叠 Option<Option<i32>>进入Option<i32> .

关于enums - 使用模式匹配参数的闭包组合 Option<Enum>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44734860/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com