为什么匹配表达式不会在其他臂之前报告全能臂 (_) 的错误?

Raj*_*jan 1 warnings match rust

Rust 有一个名为的构造match,它看起来与switch其他语言中的非常相似。但是,我观察到match.

let some_u32_value = 3;
match some_u32_value {
    _ => (),
    3 => println!("three"),
}
Run Code Online (Sandbox Code Playgroud)

match尊重提及案例/模式的顺序。如果默认( _) 大小写在顶部,为什么不报错?但它确实发出警告:

let some_u32_value = 3;
match some_u32_value {
    _ => (),
    3 => println!("three"),
}
Run Code Online (Sandbox Code Playgroud)

Java 中的一个类似构造,即 switch,不保留任何顺序,因此default在其他情况之前具有优先权不是错误(忽略 fall through 行为)。

warning: unreachable pattern
 --> src/main.rs:5:9
  |
5 |         3 => println!("three"),
  |         ^
  |
  = note: #[warn(unreachable_patterns)] on by default
Run Code Online (Sandbox Code Playgroud)

明确地这样做有什么目的吗?

Fre*_*ios 6

无法访问的模式严格来说并不是错误,我的意思是:它不会阻止编译器“理解”代码,也不会使代码不安全。

类似地,C例如,您可以在不触发错误的情况下返回对局部变量的引用(至少使用gcc):

#include <stdio.h>

int* foo() {
    int x = 0;

    return &x;
}

int main() {
    printf("%d", *foo());

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

通常,您不应将警告视为“哦,那只是警告,我不在乎”。警告是编译器给出的实际有用的建议/信息。

我喜欢给出的定义:

在识别出潜在的高风险情况、可能的误解、服务降级或即将发生的故障时,通常会发出警告。

因为它有助于理解错误和警告之间的区别:

  • 错误就是错误,
  • 警告是潜在/可能的错误或有问题的事情。

在这种情况下,最后一个分支match是一些死代码,因此编译器会相应地报告它。