Rustのmatchにおけるカンマの省略

Rustの match の腕はカンマで区切られるが、これが省略できる場合が2つある。

  1. 末尾のカンマ
  2. => { .. } の直後のカンマ
fn main() {
    match Some(1) {
        Some(x) => {
            
        } // => { .. } の直後にはカンマは省略可能
        None => () // 末尾のカンマは省略可能
    }
}

この2の規則のために、matchの腕では以前の記事で説明したのと同じ打ち切り規則が適用されている。すなわち、

  • if (else), if let (else), match, {}, while, while let, loop, for in のいずれかの式である。
  • . (メソッド呼び出し) や ? (try構文) が後続しない。

が満たされるとき、その位置でパースが打ち切られる。

そのため以下のようなソースは正しくパースされる。

fn main() {
    match Some(1) {
        Some(x) => {10}.to_string(),
        None => "".to_string(),
    };
}

なお、上の条件にあるように、 {} 以外にも if 式などでパースが打ち切られることがあるが、式文のパースとは異なり、これらの式でコンマが省略された場合はパースエラーになる。これが意図した挙動かどうかはよくわからない。

fn main() {
    match Some(1) {
        Some(x) => if true { 10 } else { 20 } + 30
        None => 40
    };
}