铁锈比赛!宏在枚举方面表现出乎意料

Rust matches! macro behaves unexpectedly in regards to enum

鉴于我使用 matches!
当我尝试将它与枚举一起使用时
然后它显示出意外的行为。

请参阅以下最小示例,该示例也可在 playground

中找到
pub enum Test {
    FIRST,
    SECOND
}

fn main() {
    let x = Test::FIRST;
    let y = Test::SECOND;
    
    println!("{}", matches!(x, Test::FIRST));   // <-- 'true',  as expected
    println!("{}", matches!(x, Test::SECOND));  // <-- 'false', as expected
    
    println!("{}", matches!(Test::FIRST,  x));  // <-- 'true', as expected
    println!("{}", matches!(Test::SECOND, x));  // <-- 'true', NOT as expected
    
    println!("{}", matches!(x, y));             // <-- 'true', NOT as expected
}

是否有一个简单的解释为什么 matches! 没有按预期运行并且
有没有一种简单的方法来比较两个 enum 变量是否相等?

matches! 的第一个参数是一个值,第二个参数是一个 模式 。模式 xy 将始终成功匹配给定的任何内容,然后将其作为新变量绑定到它。

matches! 宏将丢弃此变量,因为它未被使用。您可以在收到的警告中看到这一点:

warning: unused variable: `y`
  --> src/main.rs:16:32
   |
16 |     println!("{}", matches!(x, y));
   |                                ^ help: if this is intentional, prefix it with an underscore: `_y`

警告告诉您 matches!(x, y)matches!(x, _y) 相同。


要比较两个 enum 值是否相等,您应该实现 PartialEq 并使用 == 运算符进行比较:

#[derive(PartialEq)]
pub enum Test {
    First,
    Second,
}

fn main() {
    let x = Test::First;
    let y = Test::Second;
    println!("{}", x == y); // false
}