反駁不能なパターン

1日目では、パターンを使って複合値を 分解 する方法を簡単に見ました。ここでそれを振り返りつつ、パターンで表現できるほかのいくつかのことについて見ていきましょう:

// Copyright 2025 Google LLC
// SPDX-License-Identifier: Apache-2.0

fn takes_tuple(tuple: (char, i32, bool)) {
    let a = tuple.0;
    let b = tuple.1;
    let c = tuple.2;

    // これは上と同じことを行います。
    let (a, b, c) = tuple;

    // 最初の要素は無視し、2番目と3番目だけを束縛します。
    let (_, b, c) = tuple;

    // 最後の要素以外をすべて無視します。
    let (.., c) = tuple;
}

fn main() {
    takes_tuple(('a', 777, true));
}
  • ここで示したパターンはすべて 反駁不能 であり、右辺の値に常に一致することを意味します。

  • パターンは、反駁不能なパターンも含めて、型に固有です。タプルに要素を追加または削除して、結果として生じるコンパイラエラーを見てみてください。

  • 変数名は常に一致するパターンであり、一致した値をその名前の新しい変数に束縛します。

  • _ は常に任意の値に一致するパターンであり、一致した値は破棄されます。

  • .. を使うと、複数の値を一度に無視できます。

さらに試してみる

  • また、タプルの中央の要素を無視するなど、.. のより高度な使い方を示すこともできます。

    #![allow(unused)]
    fn main() {
    // Copyright 2025 Google LLC
    // SPDX-License-Identifier: Apache-2.0
    
    fn takes_tuple(tuple: (char, i32, bool, u8)) {
        let (first, .., last) = tuple;
    }
    }
  • これらのパターンはどれも配列でも機能します:

    #![allow(unused)]
    fn main() {
    // Copyright 2025 Google LLC
    // SPDX-License-Identifier: Apache-2.0
    
    fn takes_array(array: [u8; 5]) {
        let [first, .., last] = array;
    }
    }