【问题标题】:Rust matches! macro behaves unexpectedly in regards to enum锈匹配!宏在枚举方面表现异常
【发布时间】:2021-06-27 20:28:16
【问题描述】:

鉴于我使用 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 变量的相等性?

【问题讨论】:

    标签: rust enums macros


    【解决方案1】:

    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
    }
    

    【讨论】:

    • 谢谢,彼得,它有效。答案对你来说似乎很明显。在这种情况下,我在哪里/如何知道要实施 PartialEq?
    • @Finnfalter 你可以尝试在两个值之间进行相等性检查,编译器会告诉你它需要PartialEq
    • 如果他们不执行PartialEq怎么办?
    • @detly 未实现 PartialEq 的事物无法进行相等性比较。 不能 实现PartialEq 的东西通常是相等性毫无意义或一开始就难以定义的类型。
    • @PeterHall 我遇到了很多第 3 方库或生成的代码,没有人想到要添加必要的 #[derive(PartialEq)]。完全可以写出整个比赛语句,这只是matches! 应该帮助解决的痛苦。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 2015-04-05
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多