Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Enums 衍生出特定变体的特征_Enums_Rust_Traits - Fatal编程技术网

Enums 衍生出特定变体的特征

Enums 衍生出特定变体的特征,enums,rust,traits,Enums,Rust,Traits,假设我有以下枚举 enum MyEnum { VariantA, VariantB, VariantC, } 通过这样做,我可以导出整个枚举的PartialEq特性 #[derive(PartialEq)] enum MyEnum { VariantA, VariantB, VariantC, } 我想做的是,导出特征,但只针对特定的变体,而不是整个枚举。可能吗?(或者这有意义吗?) 我想做的是,导出特征,但只针对特定的变体,而不是整个枚举。可能吗?(或者这有意义吗?

假设我有以下枚举

enum MyEnum {
  VariantA,
  VariantB,
  VariantC,
}
通过这样做,我可以导出整个枚举的PartialEq特性

#[derive(PartialEq)]
enum MyEnum {
  VariantA,
  VariantB,
  VariantC,
}
我想做的是,导出特征,但只针对特定的变体,而不是整个枚举。可能吗?(或者这有意义吗?)

我想做的是,导出特征,但只针对特定的变体,而不是整个枚举。可能吗?(或者这有意义吗?)

这真的没有道理

特性是为类型实现的。枚举是一种类型,其变体是其值。你的问题相当于问你是否可以为一些
字符串
实现一个特征,而不是其他的

如果不受支持的变体总是返回
false
,类似于
f32
PartialEq
实现在比较
NaN
值时返回
false
,则可以手动编写该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
,因为
Eq
的实现可能被假定为总计,而这不是

我想做的是,导出特征,但只针对特定的变体,而不是整个枚举。可能吗?(或者这有意义吗?)

这真的没有道理

特性是为类型实现的。枚举是一种类型,其变体是其值。你的问题相当于问你是否可以为一些
字符串
实现一个特征,而不是其他的

如果不受支持的变体总是返回
false
,类似于
f32
PartialEq
实现在比较
NaN
值时返回
false
,则可以手动编写该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
,因为
Eq
的实现可能被假定为总计,而这不是

假设您有如下设置:

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

#[derive(PartialEq)]
enum MyEnum{
    VarA(VarA),
    VarB(VarB)
}
VarA来自不同的板条箱,您无法编译,因为它没有派生PartialEq(或任何其他外部特性)

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

进一步资料:

假设您有如下设置:

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

#[derive(PartialEq)]
enum MyEnum{
    VarA(VarA),
    VarB(VarB)
}
VarA来自不同的板条箱,您无法编译,因为它没有派生PartialEq(或任何其他外部特性)

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

进一步资料:

对我来说没有意义。特征派生是类型的编译时属性。变量是特定对象的运行时属性。听起来像是一场灾难。也许您应该描述您试图从中实现的行为。当您想要比较两个对象时,您可以使用PartialEq或Eq,比如您想要检查
MyEnum::VariantA==MyEnum::VariantB
。这些变体是来自其他板条箱的类型。并不是所有人都能实现PartialEq特性。但我很乐意在任何时候使用它;我更愿意将其保留为单个枚举。在这种情况下,您最好的选择可能是手动实现
PartialEq
impl PartialEq for MyEnum
),这样每当一个不受支持的变量用作操作数时,它就会返回
false
。@apemanzilla是的,这将是我的最后一个选择。实际上,您可以从Rust获得生成的代码,并删除有问题的代码。但是每次你用更多的变量更新枚举时,你都必须重做它。这对我来说没有意义。特征派生是类型的编译时属性。变量是特定对象的运行时属性。听起来像是一场灾难。也许您应该描述您试图从中实现的行为。当您想要比较两个对象时,您可以使用PartialEq或Eq,比如您想要检查
MyEnum::VariantA==MyEnum::VariantB
。这些变体是来自其他板条箱的类型。并不是所有人都能实现PartialEq特性。但我很乐意在任何时候使用它;我更愿意将其保留为单个枚举。在这种情况下,您最好的选择可能是手动实现
PartialEq
impl PartialEq for MyEnum
),这样每当一个不受支持的变量用作操作数时,它就会返回
false
。@apemanzilla是的,这将是我的最后一个选择。实际上,您可以从Rust获得生成的代码,并删除有问题的代码。但每次使用更多变量更新枚举时,都必须重新执行。