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获得生成的代码,并删除有问题的代码。但每次使用更多变量更新枚举时,都必须重新执行。