Открыть сервис

Сопоставление с образцом в программировании

Сопоставление с образцом — это механизм в языках программирования, позволяющий проверять структуру значения и одновременно извлекать из него составные части. Конструкция описывает форму данных (образец) и в случае совпадения связывает переменные с соответствующими фрагментами. В отличие от обычного сравнения на равенство, сопоставление с образцом работает с составными типами — кортежами, списками, алгебраическими типами, объектами — и может учитывать их внутреннее устройство.

Общая идея

Образец задаёт «шаблон» значения. Если проверяемое значение ему соответствует, происходит успешное сопоставление, а переменные внутри образца получают конкретные значения. Если нет — управление передаётся следующей ветви или возникает ошибка. Такой подход объединяет проверку условия и декомпозицию данных в одной синтаксической конструкции.

Простейший случай — сопоставление с литералом (числом, строкой, символом). Более сложный — сопоставление с конструктором: например, образец Some(x) в языке с алгебраическими типами совпадает только со значением, построенным конструктором Some, и связывает x с его содержимым.

Виды образцов

Распространённые разновидности образцов:

  • Литеральные — точное значение (0, "ok", true).
  • Переменные — связывают всё значение с именем.
  • Wildcard — образец _, совпадающий с чем угодно без связывания.
  • Кортежные и списочные — разбирают структуру по позициям ((a, b), [x, y, ...rest]).
  • Конструкторные — сопоставляются с тегами алгебраических типов (None, Cons(h, t)).
  • С охраняющими условиями (guards) — совпадение дополняется логическим выражением.
  • С вложением — образцы комбинируются на произвольную глубину.

Примеры в языках

Сопоставление с образцом присутствует во многих функциональных языках. В Haskell и ML оно встроено в определение функций и выражение case. В Erlang и Elixir образцы используются при приёме сообщений и в заголовках функций. В Scala конструкция match работает с классами-образцами (case classes). В Rust оператор match требует исчерпывающего покрытия всех вариантов, что проверяется компилятором. В Python начиная с версии 3.10 появился оператор match/case со структурными образцами. В C# и Swift также реализованы соответствующие конструкции.

Сопоставление с образцом и проверка исчерпываемости

Одно из ключевых свойств в статически типизированных языках — проверка полноты (исчерпываемости) на этапе компиляции. Компилятор анализирует, покрывают ли ветви все возможные варианты типа. Если какой-то случай не обработан, выдаётся предупреждение или ошибка. Это снижает число ошибок времени выполнения, связанных с непредвиденными значениями.

Связь с другими механизмами

Сопоставление с образцом отличается от:

  • условных операторов — оно не только проверяет, но и разбирает значение;
  • полиморфизма — диспетчеризация здесь основана на форме данных, а не на типе объекта;
  • регулярных выражений — те сопоставляют строки, тогда как образцы работают с произвольными структурами данных.

В ряде языков образцы применяются и к тексту: например, сопоставление строк по шаблону в регулярных выражениях и в конструкции case для строк.

Применение

Сопоставление с образцом широко используется при разборе (парсинге) структур, обработке вариантов алгебраических типов, реализации интерпретаторов и компиляторов, обработке сообщений в параллельных системах, работе с древовидными и рекурсивными данными. Оно повышает читаемость кода, заменяя длинные цепочки условных проверок компактными и наглядными описаниями.

IRONLIVE — база данных и аналитика по компаниям России.

На главную IRONLIVE →