Неопровержимые шаблоны
В первый день мы кратко увидели, как шаблоны можно использовать для деструктуризации составных значений. Давайте повторим это и поговорим о других вещах, которые могут выражать шаблоны:
// 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;
// Пропустить первый элемент, связать только второй и третий.
let (_, b, c) = tuple;
// Пропустить всё, кроме последнего элемента.
let (.., c) = tuple;
}
fn main() {
takes_tuple(('a', 777, true));
}
-
Все показанные шаблоны — неопровержимые (irrefutable), то есть они всегда совпадают со значением в правой части.
-
Шаблоны привязаны к типу, в том числе неопровержимые. Попробуйте добавить или убрать элемент в кортеже и посмотрите на ошибки компилятора.
-
Имена переменных — это шаблоны, которые всегда совпадают и связывают сопоставленное значение с новой переменной с этим именем.
-
_— шаблон, который всегда совпадает с любым значением и отбрасывает его. -
..позволяет проигнорировать сразу несколько значений.
Для дальнейшего изучения
-
Можно также показать более продвинутое использование
.., например игнорирование средних элементов кортежа.#![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; } }