铁锈比赛!宏在枚举方面表现出乎意料
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!
的第一个参数是一个值,第二个参数是一个 模式 。模式 x
和 y
将始终成功匹配给定的任何内容,然后将其作为新变量绑定到它。
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
}
鉴于我使用 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!
的第一个参数是一个值,第二个参数是一个 模式 。模式 x
和 y
将始终成功匹配给定的任何内容,然后将其作为新变量绑定到它。
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
}