OOP Course
Сьогодні

Підрозділ 9.3

Патерни кортежів

Показує tuple patterns у switch expression: зіставлення кількох значень кортежу, пропуск елементів через _ і комбінування умов.

9.3. Патерни кортежів

У попередніх секціях ми перевіряли один об'єкт або одне значення. Але багато практичних рішень залежать від кількох незалежних вимірів одночасно: «який протокол лікування призначити пацієнту, якщо його тиск категорії X і вік у діапазоні Y?». Перевіряти кожну комбінацію через вкладені if-else — громіздко і важко читати. Патерн кортежів вирішує це елегантно: передаємо кілька значень як кортеж у switch і описуємо кожну значущу комбінацію окремим arm.

Механізм: як це компілюється

Коли ви пишете:

(specialty, shift) switch
{
    ("Кардіологія", "День") => ...,
    ...
}

Компілятор створює тимчасовий ValueTuple<string, string> з переданих значень і зіставляє його з кожним arm. Це той самий ValueTuple з розділу 8.9 — лише використаний не для зберігання і передачі, а як ключ для перемикання. Жодної магії: синтаксис (a, b) switch — це switch над кортежем.

Вкладені патерни в позиціях кортежу

Кожна позиція кортежу може містити будь-який патерн — не лише рядок або число. В позицію можна вставити:

  • константу ("Кардіологія", 42);
  • discard _ — «будь-яке значення»;
  • реляційний патерн (> 140, < 18);
  • var ім'я — захопити значення у змінну;
  • навіть вкладений property pattern.

Це робить кортежний патерн потужним: один switch замінює складну ієрархію перевірок.

Патерн кортежів: двовимірне зіставлення

Клінічний приклад: розклад та правила призначень

Визначимо логіку призначення лікаря на прийом залежно від спеціалізації і зміни:

Arm-и обробляються зверху вниз: перший збіг виграє. Тому порядок важливий: конкретні комбінації мають іти першими, загальні (з _) — в кінці. Якщо поставити _ на початок — він поглине всі наступні arm-и.

Вкладені реляційні патерни: медичне рішення

Особливо потужна можливість — реляційні патерни в позиціях кортежу. Можна перевіряти не рівність значення, а діапазон:

Зверніть: у другій позиції кортежу стоїть >= 60 and < 120 — це логічний патерн всередині arm-а кортежу. Позиції кортежу дозволяють будь-який патерн, включаючи складені логічні вирази.

Вичерпність (exhaustiveness)

Компілятор аналізує, чи всі можливі комбінації значень покриті. Якщо ні і відсутній _ — попередження (warning). У switch expression це важливо: якщо жоден arm не збігається — кидається MatchFailedException у runtime.

Тому для кортежних патернів завжди завершуйте switch arm-ом _ або логічно повним набором умов, що покривають всі випадки.

Коли обирати кортежний патерн

Кортежний патерн найкраще підходить, коли:

  • рішення залежить від двох або більше незалежних вимірів одночасно;
  • кожна комбінація вимірів дає унікальний результат;
  • альтернатива — вкладені if-else або таблиця умов.

Якщо рішення залежить від властивостей одного об'єкта — краще використовувати патерн властивостей (9.2). Якщо рішення залежить від типу об'єкта в ієрархії — патерн типів (9.1). Кортежний патерн — для кількох незалежних вхідних змінних.

Розроблено Tomka Yurii · © 2026 ·