我认为这只是模式匹配的限制,旨在防止意外行为.
Atag
with类型的完整"定义" Core
是Atag::Core(raw::Core)
.显然,这些内容Core
与你无关,但编译器需要知道所有内容都是"占用"的,因为编译器是规则的坚持者.解决这个问题的最简单方法是使用"任何模式",_
就像你匹配非Core
变体一样.
impl Atag { /// Returns `Some` if this is a `Core` ATAG. Otherwise returns `None`. pub fn core(self) -> Option{ match self { // The compiler now knows that a value is expected, // but isn't necessary for the purposes of our program. Atag::Core(_) => Some(self), _ => None } } }
要忽略多个值,您可以使用Something::Foo(_, _)
- 变量中每个值的一个下划线,或Something::Foo(..)
忽略所有值.
请记住,与其他语言不同,Rust枚举不仅仅是"不仅仅是"不同类型的集合.与枚举值相关联的数据是其中的一部分,就像结构的字段一样.所以self == Atag::Core
这不是一个有意义的陈述,因为它忽略了与a相关的数据Core
.A Foo(0)
与a不同Foo(12)
,即使它们都是Foo
变体.
我还要指出if let
,就我所知,这是一个标准if
语句的最接近的选项,而没有定义自定义is_core
函数Atag
(考虑到存在match
和if let
,基本上没有必要).
impl Atag { /// Returns `Some` if this is a `Core` ATAG. Otherwise returns `None`. pub fn core(self) -> Option{ if let Atag::Core(_) = self { Some(self) } else { None } } }