【问题标题】:Compare nested enum variants in Rust比较 Rust 中的嵌套枚举变体
【发布时间】:2019-03-06 21:13:48
【问题描述】:

学习 Rust 我碰巧需要比较嵌套枚举中的变体。考虑以下枚举,我如何比较实例化 BuffTurget 的实际变体?

enum Attribute {
  Strength,
  Agility,
  Intellect,
}

enum Parameter {
    Health,
    Mana,
}

enum BuffTarget {
    Attribute(Attribute),
    Parameter(Parameter),
}

在网上搜索让我找到了`discriminant and particularly to compare function,如下所示:

fn variant_eq<T>(a: &T, b: &T) -> bool {
    std::mem::discriminant(a) == std::mem::discriminant(b)
}

不幸的是,这个功能在我的情况下不起作用:

#[test]
fn variant_check_is_working() {
    let str = BuffTarget::Attribute(Attribute::Strength);
    let int = BuffTarget::Attribute(Attribute::Intellect);
    assert_eq!(variant_eq(&str, &int), false);
}

// Output:

// thread 'tests::variant_check' panicked at 'assertion failed: `(left == right)`
// left: `true`,
// right: `false`', src/lib.rs:11:9

理想情况下,我希望我的代码是这样的,使用if let:

let type_1 = get_variant(BuffTarget::Attribute(Attribute::Strength));
let type_2 = get_variant(BuffTarget::Attribute(Attribute::Intellect));

if let type_1 = type_2 {  
    println!("Damn it!") 
} else { println!("Success!!!") }

【问题讨论】:

标签: enums rust comparison


【解决方案1】:

this answer 中找到合适的解决方案。将#[derive(PartialEq)] 用于枚举以将它们与== 进行比较:enum_1 == enum_2

#[derive(PartialEq)]
enum Attribute {
  Strength,
  Agility,
  Intellect,
}

#[derive(PartialEq)]
enum Parameter {
    Health,
    Mana,
}

#[derive(PartialEq)]
enum BuffTarget {
    Attribute(Attribute),
    Parameter(Parameter),
}

let type_1 = BuffTarget::Attribute(Attribute::Strength));
let type_2 = BuffTarget::Attribute(Attribute::Intellect));

assert_eq!((type_1 == type_2), false);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-24
    • 2023-02-14
    • 1970-01-01
    • 1970-01-01
    • 2023-01-18
    • 2022-01-05
    • 1970-01-01
    • 2014-03-15
    相关资源
    最近更新 更多