如何在不使用强制转换的情况下比较Enum值与u32类型
解决方案
方法1:实现跨类型的PartialEq trait
Rust默认的PartialEq只支持同类型比较,我们可以为FALUDA枚举实现与u32的跨类型相等判断,直接使用==运算符完成比较:
#[derive(PartialEq)] enum FALUDA { Juice, Ice, } // 让FALUDA可以和u32比较 impl PartialEq<u32> for FALUDA { fn eq(&self, other: &u32) -> bool { match self { FALUDA::Juice => *other == 0, // 定义Juice对应数值0 FALUDA::Ice => *other == 1, // 定义Ice对应数值1,可按需修改 } } } // 让u32可以和FALUDA比较(支持`a == FALUDA::Juice`的写法) impl PartialEq<FALUDA> for u32 { fn eq(&self, other: &FALUDA) -> bool { other.eq(self) // 复用已有实现,避免重复代码 } } fn main() { let a: u32 = 0; if a == FALUDA::Juice { println!("Yay"); } }
方法2:通过关联函数转换后比较
给枚举添加一个将u32转换为枚举变体的关联函数,再比较转换结果,这种方式能处理无效数值的情况,安全性更高:
#[derive(PartialEq)] enum FALUDA { Juice, Ice, } impl FALUDA { // 将u32转换为对应的枚举变体,无效值返回None fn from_u32(val: u32) -> Option<Self> { match val { 0 => Some(FALUDA::Juice), 1 => Some(FALUDA::Ice), _ => None, } } } fn main() { let a: u32 = 0; if FALUDA::from_u32(a) == Some(FALUDA::Juice) { println!("Yay"); } }
方法3:让枚举变体携带数值(按需选择)
如果枚举变体本身需要关联特定数值,可以直接将数值嵌入变体,通过访问变体的数值完成比较:
#[derive(PartialEq)] enum FALUDA { Juice(u32), Ice(u32), } fn main() { let a: u32 = 0; // 直接比较Juice变体携带的数值 if a == FALUDA::Juice(0).0 { println!("Yay"); } }
内容的提问来源于stack exchange,提问作者optimus prime
相关产品推荐
相关产品推荐

