我有一个next_expected_kind
方法,如果Iterable<Kind>
的下一项是预期的类型,则返回它,否则返回一个错误。
对于Kind1
这样的非参数化类型,它可以很好地工作,但是如果Kind2
这样的类型需要参数,我不知道如何使用它。
类似于:
let _val = match s.next_expected_kind(Kind::Kind2(str)) {
Ok(k) => str,
_ => panic!("error"),
};
#[derive(PartialEq, Eq)]
enum Kind {
Kind1,
Kind2(String),
}
struct S {
kinds: std::vec::IntoIter<Kind>,
}
impl S {
fn next_expected_kind(&mut self, expected: Kind) -> Result<Kind, &str> {
match self.kinds.next() {
Some(k) if k == expected => Ok(k),
_ => Err("not expected"),
}
}
}
fn main() {
let mut s = S {
kinds: vec![Kind::Kind1, Kind::Kind2(String::from("2"))].into_iter(),
};
_ = s.next_expected_kind(Kind::Kind1);
// let _val = s.next_expected_kind(Kind::Kind2(str));
let _val = match s.kinds.next() {
Some(Kind::Kind2(str)) => str,
_ => panic!("not expected"),
};
}
1条答案
按热度按时间xdnvmnnf1#
您可以像这样使用
std::mem::discriminant()
:一个明显的缺点是,无论在哪里调用,都必须创建一个带有“空”或默认数据的示例。
我能想到的唯一其他方法是编写一个宏,因为您不能只传递枚举的“变体”。
注意:这有一个限制,所有的变体必须是元组变体或结构体变体,使用起来有点笨拙。