在群里看有段代码,自己实现一个枚举相当的判断
enum Cate {
A,
B,
}
impl PartialEq for Cate {
fn eq(&self, other: &Self) -> bool {
*self == *other
}
}
fn main() {
let a = Cate::A;
let b = Cate::B;
let c = Cate::B;
if a == b {
println!("a=b");
} else {
println!("a!=b");
};
if b == c {
println!("b=c");
} else {
println!("b!=c");
};
}
发现这样写不行,为什么会报错?
修改之后
impl PartialEq for Cate {
fn eq(&self, other: &Self) -> bool {
match (self,other) {
(Cate::A,Cate::A) => true,
(Cate::B,Cate::B) => true,
_ => false
}
}
}
这样可以了。
rust内置了一个宏PartialEq
一个热心同学打印出了过程宏生成的代码
impl PartialEq for Cate {
fn eq(&self, other: &Self) -> bool {
{
use std::intrinsics::discriminant_value;
let __self_vi = unsafe { discriminant_value(&*self) } as isize;
let __arg_1_vi = unsafe { discriminant_value(&*other) } as isize;
dbg!(__self_vi, __arg_1_vi);
dbg!(__self_vi == __arg_1_vi);
if true && __self_vi == __arg_1_vi {
match (&*self, &*other) { _ => true, }
} else {
false
}
}
}
}
不解为什么要这样写? 两个 dbg! 我加的。 为什么要转为数字? 既然转为数字了 , 直接比较不就好了吗 ,怎么还多此一举?
1
共 3 条评论, 1 页
评论区
写评论对于有其他data的enum比如
除了比较discriminant之外还要继续比较内部的值:
看到异常消息:
就应该能知道是什么问题了。
你直接比较用的
eq
不就是你==
么,那么不就是变成鸡蛋问题了吗