铁锈匹配!宏在枚举方面的行为异常

Fin*_*ter 3 macros enums rust

鉴于我使用火柴!
当我尝试将它与枚举一起使用时
,它会显示出意外的行为。

请参阅以下最小示例,该示例也可在游乐场中使用

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
}
Run Code Online (Sandbox Code Playgroud)

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

Pet*_*all 7

第一个参数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`
Run Code Online (Sandbox Code Playgroud)

该警告告诉您,这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
}
Run Code Online (Sandbox Code Playgroud)