设置
我有一个枚举,它的变体有结构参数,沿着枚举的向量:
struct A { x: i64, };
struct B { x: f64, },
enum E {
One(A),
Two(B),
// maybe others
};
fn main() {
let v = vec![ One( A { x: 10 } ), Two( B { x : 5. } ), /* others as well */ ];
// ...
}
任务
在v
中查找E::Two
类型的元素。
问题
什么是简洁的,Rust惯用的方法来做到这一点?
首选方法
使用可迭代的find()
方法,而不用在A
和B
上派生或实现Eq
和PartialEq
,因为 * 我想找到相同枚举变量的东西 *;我并不关心变量的内容,另外,派生Eq
和PartialEq
是多余的,而且可能会很痛苦。
3条答案
按热度按时间9nvpjoqh1#
您可以使用内置的
matches!
宏来简化此操作:使用宏是编写以下等效代码的一种更简洁的方法:
在这两种情况下,
found_item
的类型都是Option<&E>
,如果你只想知道这样的元素是否存在,你可以在这个结果上调用.is_some()
,或者你可以使用Iterator::any()
,它只返回一个bool
来指示是否找到了匹配的元素:如果你想知道找到的项目的 index,你可以使用
Iterator::position()
:index
将是Option<usize>
,如果找到匹配项,则Option<usize>
仅为Some
,并且所包含的usize
值将是匹配发生处的索引。vc6uscn92#
使用std::mem::discriminant函数:
w8f9ii693#
这两种可能性都没有使用首选方法。
循环,但不可迭代
find
我在网上的某个地方找到了这个(也许甚至如此)
可迭代
find
,但需要派生为
A
、B
和E
类型实现或派生Eq
和PartialEq
。