Rust枚举方法实现报错:非指定变体时如何返回None?
解决Rust枚举过滤方法的编译错误
让我来帮你分析下这两个错误的原因,以及如何正确实现你想要的“过滤特定枚举值并返回关联值”的功能:
第一个match写法的错误原因
你定义的Atag::Core是一个元组变体——它携带了一个Core类型的关联值(哪怕Core是单元结构体,这个变体依然是带参数的形式)。在match语句里,如果你只写Atag::Core,编译器会默认你在匹配一个单元变体(比如你的Atag::None,没有任何关联值),因此抛出了“expected unit struct/variant or constant”的错误。
正确的match实现方式
我们需要在匹配时绑定这个变体的关联值,然后直接返回它:
impl Atag { /// 若为Core类型ATAG则返回Some,否则返回None。 pub fn core(self) -> Option<Core> { match self { // 绑定Core变体的关联值到core_val变量 Atag::Core(core_val) => Some(core_val), _ => None, } } }
第二个==写法的错误原因
这个错误有两层问题:
- 缺少
PartialEq实现:你的Atag枚举没有派生PartialEqtrait,Rust不会自动为包含&'static str的枚举推导这个trait(不过你可以手动添加#[derive(Debug, Copy, Clone, PartialEq)]到Atag枚举上来解决这个问题)。 - 变体匹配格式错误:就算实现了
PartialEq,你写self == Atag::Core依然不对——Atag::Core是元组变体,必须传入一个Core实例才能构成完整的变体值,也就是Atag::Core(Core)。但这种写法完全没必要,match不仅更符合Rust的惯用风格,还能直接拿到你需要的关联值,不需要额外构造匹配的变体。
扩展:实现其他变体的过滤方法
用同样的逻辑,你可以轻松实现Mem变体的过滤方法:
impl Atag { // ... 上面的core方法 ... /// 若为Mem类型ATAG则返回Some,否则返回None。 pub fn mem(self) -> Option<Mem> { match self { Atag::Mem(mem_val) => Some(mem_val), _ => None, } } }
这样修改后,你的代码就能正常编译,并且实现你想要的功能了。
内容的提问来源于stack exchange,提问作者James Taylor
相关产品推荐
相关产品推荐

