代码之家  ›  专栏  ›  技术社区  ›  Omar Abid

获得特定变体的特征

  •  0
  • Omar Abid  · 技术社区  · 7 年前

    假设我有以下枚举

    enum MyEnum {
      VariantA,
      VariantB,
      VariantC,
    }
    

    通过这样做,我可以导出整个枚举的partialeq特征

    #[derive(PartialEq)]
    enum MyEnum {
      VariantA,
      VariantB,
      VariantC,
    }
    

    我想做的是,导出特征,但仅限于特定的变量,而不是整个枚举。有可能吗?(或者它是否有意义?).

    0 回复  |  直到 7 年前
        1
  •  2
  •   Peter Hall    7 年前

    我想做的是,导出特征,但仅限于特定的变量,而不是整个枚举。有可能吗?(或者它是否有意义?).

    这真的没有道理。

    特征是为了 类型 . 枚举是一种类型,它的变量是它的值。你的问题相当于问你是否可以为一些 String 但不是其他人。

    如果不支持的变量总是返回 false ,类似于 f32 PartialEq 实现返回 每当你比较 NaN 值,然后您可以手动编写该impl:

    impl PartialEq for MyEnum {
        fn eq(&self, other: &MyEnum) -> bool {
            use MyEnum::*;
            match (self, other) {
                // VariantA and VariantB are supported
                (VariantA(value), VariantA(other_value)) => value == other_value,
                (VariantB(value), VariantB(other_value)) => value == other_value,
                // Any other combinations of variants end up here
                _ => false,
            }
        }
    }
    

    注意你必须 实施 Eq 这样,因为 情商 可能被认为是 全部的 ,但这不是。

        2
  •  2
  •   Mithnar    7 年前

    假设您的设置如下:

    #[derive(PartialEq)]
    struct VarB{
        pub value: u32,
    }
    
    #[derive(PartialEq)]
    enum MyEnum{
        VarA(VarA),
        VarB(VarB)
    }
    

    vara来自不同的板条箱,由于它没有派生的partialeq(或任何其他外部特性),所以无法编译。

    您可以使用newtype模式解决这个问题(假设您有权访问相关字段/访问器)

    struct MyVarA(VarA);
    
    impl PartialEq for MyVarA{
        fn eq(&self, other: &MyVarA) -> bool {
            self.0.value == other.0.value
        }
    
        fn ne(&self, other: &MyVarA) -> bool {
            self.0.value != other.0.value
        }
    }
    
    #[derive(PartialEq)]
    struct VarB{
        value: u32,
    }
    
    #[derive(PartialEq)]
    enum MyEnum{
        VarA(MyVarA),
        VarB(VarB)
    }
    

    更多信息: https://doc.rust-lang.org/rust-by-example/generics/new_types.html

    推荐文章