< 返回版块

lizhichao 发表于 2019-07-18 16:35

Tags:PartialEq

在群里看有段代码,自己实现一个枚举相当的判断

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! 我加的。 为什么要转为数字? 既然转为数字了 , 直接比较不就好了吗 ,怎么还多此一举?

评论区

写评论
robertking 2019-07-24 18:26

对于有其他data的enum比如

#[derive(PartialEq)]
enum Cate {
    A,
    B(i32),
}

除了比较discriminant之外还要继续比较内部的值:

impl ::std::cmp::PartialEq for Cate {
    #[inline]
    fn eq(&self, other: &Cate) -> bool {
        {
            let __self_vi =
                unsafe { ::std::intrinsics::discriminant_value(&*self) } as
                    isize;
            let __arg_1_vi =
                unsafe { ::std::intrinsics::discriminant_value(&*other) } as
                    isize;
            if true && __self_vi == __arg_1_vi {
                match (&*self, &*other) {
                    (&Cate::B(ref __self_0), &Cate::B(ref __arg_1_0)) =>
                    (*__self_0) == (*__arg_1_0),
                    _ => true,
                }
            } else { false }
        }
    }
}
smilingleo 2019-07-19 12:53

看到异常消息:

thread 'main' has overflowed its stack

就应该能知道是什么问题了。

yjhmelody 2019-07-18 21:58

你直接比较用的eq不就是你==么,那么不就是变成鸡蛋问题了吗

1 共 3 条评论, 1 页