反駁不能なパターン
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; } }