switch 和 match 语法之间有什么区别?

What is the difference between the switch and match syntax?

有些语言有 switch expression/statement,有些语言有 match 语句。这在语义上有区别吗,或者它只是基本相同的东西的不同语法。

例如:

Rust 有 match:

match coin {
    Coin::Penny => 1,
    Coin::Nickel => 5,
    Coin::Dime => 10,
    Coin::Quarter(state) => 25,
}

(摘自https://doc.rust-lang.org/book/ch06-02-match.html#the-match-control-flow-operator.

Java 有开关:

switch coin {
    case Penny:
        return 1;
        break;
    case Nickel:
        return 5;
        break;
    case Dime:
        return 10;
        break;
    case Quarter:
        return 25;
        break;
}

(一段等价代码。)

警告:当然,这因语言而异。 在这里,我将使用 Java switch 语句,因为它是一种常用的语言,它的 switch 语义似乎大致具有代表性。

几个主要区别是:

  • match 是详尽无遗的(即您必须能够向编译器证明恰好有一个分支匹配)
  • match 是一个 表达式(虽然可以说这是一个 Rust 特性而不是 match 特性),即:
let x = 123;
let s = match x {
  0 => "zero",
  1 => "one",
  _ => "something else",
};
println!("{}", s);  // prints "something else"
  • match 执行解构:
let x = Some(123);
let s = match x {
  None => "nothing".to_string(),
  Some(x) => format!("the number: {}", x),
};
println!("{}", s);  // prints "the number: 123"

但是,您确实应该查看 match 的文档,并将它们与另一种语言的相关 switch 功能的文档进行比较。这些只是与类 C 开关相比的明显差异。