Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Неопровержимые шаблоны

В первый день мы кратко увидели, как шаблоны можно использовать для деструктуризации составных значений. Давайте повторим это и поговорим о других вещах, которые могут выражать шаблоны:

// 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));
}
This slide should take about 5 minutes.
  • Все показанные шаблоны — неопровержимые (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;
    }
    }