我有这样一种类型:
#[derive(PartialEq, Eq, Debug, Clone)]
enum MyEnum {
ValueOne,
ValueTwo,
Integer(i32),
Text(String),
}
在我的代码中,我有很多类似的模式:
let value = match iterator.next() {
Some(MyEnum::ValueOne) => MyEnum::ValueOne,
Some(value) => return Err(format!("Unexpected value {:?}", value)),
None => return Err("Unexpected end of input!"),
}
或者这个:
let value = match iterator.next() {
Some(MyEnum::Integer(i)) => MyEnum::Integer(i),
Some(value) => return Err(format!("Unexpected value {:?}", value)),
None => return Err("Unexpected end of input!"),
}
我想创建一个泛型函数take_value
,我可以在其中指定所需的MyEnum
类型,它返回Result
我只能用这样简单的值来解它:
fn take_value(iterator: &mut Iterator<MyEnum>, expected: MyEnum) -> Result<MyEnum, String> {
match iterator.next() {
Some(expected) => Ok(expected),
Some(value) => Err(format!("Unexpected value {:?}", value)),
None => Err("Unexpected end of input!"),
}
}
它可以这样称呼:let value = take_value(iterator, MyEnum::ValueOne)?;
但是如何修改这个函数,使它可以被MyEnum::Integer调用,而不指定其中的整数值呢?
3条答案
按热度按时间ttcibm8c1#
你不能用一个函数来做,但是下面的宏很接近你想要的,因为我们必须区分模式
:pat
和表达式:expr
,你必须重复这一部分。outputs
vxbzzdmp2#
你不能用这种“示例值”来做这件事,你需要给你的
take_value
函数传递一个 predicate 回调:你可以这样称呼它
Playground
或者,您可以使用一个简单的宏来隐藏 predicate 是回调的事实:
它允许像这样调用
take_value
:Playground
lztngnrs3#
我经常看到的一种方法,即使它有一些样板,也只是为每个枚举变量创建一个转换函数。
用法:
我将
Option
放在实现之外,因为它似乎不属于这里,但是您可以按照自己的意愿来做。