< 返回版块

asuper 发表于 2024-08-29 14:47

Tags:matches enum

#[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;

这样结果就是对的

评论区

写评论
作者 asuper 2024-09-13 17:42

我去clippy提了一个issue,答复我已经有过讨论了 #86112

--
👇
lithbitren: 原来是变量不能匹配!以前都没发现,这里值得一个编译警告。

lithbitren 2024-09-12 12:59

原来是变量不能匹配!以前都没发现,这里值得一个编译警告。

SleepyBoy 2024-08-30 15:17

我还是基础不牢啊,差点把我也唬住了啊😥

我知道matches是模式匹配简写宏,也看到了最后宏用的是变量,但是不展开都没联想到变量匹配啊

bestgopher 2024-08-30 09:55

我以为是这样的:

match &ea {
  x if x == m => true,
  _ => false
}

--  
👇  
ribs: matches!(&ea, m);
展开后是:

match &ea { m => true, _ => false }


现在应该知道为什么是true吧
作者 asuper 2024-08-30 09:16

脑子没转过弯来,昨天下班路上我就想明白了,m和前面那个变量没有一点关系 🤣

dcsmf 2024-08-29 18:19

matches!宏的参数是(值,模式),m是个变量,而不是一个模式,它会匹配任何值

比如你这样定义,它也是true

let m = 123;
is_eq = matches!(&ea, m);
println!("{:?} eq to {:?}: {}", ea, m, is_eq);

--
👇
asuper: 我之前也看了宏定义,宏掌握的不是太好,大概也能看出来展开会是这个样子,不过还是不太懂。 这个是match了类型而不是具体值?

--
👇
ribs: matches!(&ea, m); 展开后是:

match &ea {
  m => true,
  _ => false
}

现在应该知道为什么是true吧

作者 asuper 2024-08-29 17:55

我之前也看了宏定义,宏掌握的不是太好,大概也能看出来展开会是这个样子,不过还是不太懂。 这个是match了类型而不是具体值?

--
👇
ribs: matches!(&ea, m); 展开后是:

match &ea {
  m => true,
  _ => false
}

现在应该知道为什么是true吧

ribs 2024-08-29 16:14

matches!(&ea, m); 展开后是:

match &ea {
  m => true,
  _ => false
}

现在应该知道为什么是true吧

1 共 8 条评论, 1 页