鉴于我使用火柴!宏
当我尝试将它与枚举一起使用时
,它会显示出意外的行为。
请参阅以下最小示例,该示例也可在游乐场中使用
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变量的相等性?
第一个参数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`
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)
| 归档时间: |
|
| 查看次数: |
1303 次 |
| 最近记录: |