#[derive(Debug)]
enum TheEnum {
AA,
BB,
CC,
}
pub fn t1() {
let ea = TheEnum::AA;
let mut is_eq = matches!(&ea, TheEnum::AA);
println!("{:?} eq to {:?}: {}", ea, TheEnum::AA, is_eq);
is_eq = matches!(&ea, TheEnum::BB);
println!("{:?} eq to {:?}: {}", ea, TheEnum::BB, is_eq);
let mut m = TheEnum::AA;
is_eq = matches!(&ea, m);
println!("{:?} eq to {:?}: {}", ea, m, is_eq);
m = TheEnum::BB;
is_eq = matches!(&ea, m);
println!("{:?} eq to {:?}: {}", ea, m, is_eq);
}
运行结果如下:
AA eq to AA: true
AA eq to BB: false
AA eq to AA: true
AA eq to BB: true
前面3个都是正确的,但是最后的一次匹配,结果是错的,我尝试了让TheEnum 类型 derive(PartialEq),然后直接
is_eq = ea == m;
这样结果就是对的
1
共 8 条评论, 1 页
评论区
写评论我去clippy提了一个issue,答复我已经有过讨论了 #86112
--
👇
lithbitren: 原来是变量不能匹配!以前都没发现,这里值得一个编译警告。
原来是变量不能匹配!以前都没发现,这里值得一个编译警告。
我还是基础不牢啊,差点把我也唬住了啊😥
我知道matches是模式匹配简写宏,也看到了最后宏用的是变量,但是不展开都没联想到变量匹配啊
我以为是这样的:
match &ea { m => true, _ => false }
脑子没转过弯来,昨天下班路上我就想明白了,m和前面那个变量没有一点关系 🤣
matches!宏的参数是(值,模式),m是个变量,而不是一个模式,它会匹配任何值
比如你这样定义,它也是true
--
👇
asuper: 我之前也看了宏定义,宏掌握的不是太好,大概也能看出来展开会是这个样子,不过还是不太懂。 这个是match了类型而不是具体值?
--
👇
ribs: matches!(&ea, m); 展开后是:
现在应该知道为什么是true吧
我之前也看了宏定义,宏掌握的不是太好,大概也能看出来展开会是这个样子,不过还是不太懂。 这个是match了类型而不是具体值?
--
👇
ribs: matches!(&ea, m); 展开后是:
现在应该知道为什么是true吧
matches!(&ea, m); 展开后是:
现在应该知道为什么是true吧