如何在Rust中实现CellContent与Symbol两种枚举类型的比较?
问题解决:Rust中CellContent与Symbol的直接比较
你的代码编译报错的核心原因是:在eq方法里,self是&CellContent类型的引用,而CellContent::None是值类型,Rust不允许直接比较引用和值;同时原逻辑也未处理Move变体内部Symbol的实际比较需求。
正确实现步骤:
- 先给
Symbol派生PartialEqtrait,让Rust自动为其生成相等比较逻辑:
#[derive(PartialEq)] pub enum Symbol { X, O, }
- 通过模式匹配实现
CellContent对Symbol的PartialEq,处理不同变体的比较逻辑:
pub enum CellContent { Move(Symbol), None, } impl PartialEq<Symbol> for CellContent { fn eq(&self, other: &Symbol) -> bool { match self { // 匹配Move变体,取出内部Symbol与目标Symbol比较 CellContent::Move(s) => s == other, // 空单元格直接返回不相等 CellContent::None => false, } } }
验证测试代码:
fn main() { let cellX = CellContent::Move(Symbol::X); let cellO = CellContent::Move(Symbol::O); let cellEmpty = CellContent::None; assert!(cellX == Symbol::X); assert!(cellO != Symbol::X); assert!(cellEmpty != Symbol::X); assert!(cellO == Symbol::O); }
此时就能直接用==/!=完成CellContent实例与Symbol的比较。
内容的提问来源于stack exchange,提问作者realtebo
相关产品推荐
相关产品推荐

