У багатьох мовах програмування конструкція switch поєднується з default‑гілкою — і саме там часто ховаються помилки: розробник забуває обробити один із варіантів переліку (enum), а програма мовчки йде в «за замовчуванням». У розмові на каналі The Pragmatic Engineer інженерка з команди Rust for Android у Google та радниця Rust language team Аліс Рюл пояснює, як Rust принципово усуває цей клас помилок.

Від switch до match: інший підхід до переліків
У Rust немає класичного switch — замість нього використовується оператор match. Ідея знайома: є значення (наприклад, елемент enum), і код розгалужується залежно від того, який це варіант. Але ключова відмінність у тому, як мова ставиться до повноти такого розгалуження.
Коли розробник використовує match для enum:
- потрібно явно перелічити всі можливі варіанти;
- якщо хоча б один варіант пропущено, це не попередження, а помилка компіляції;
- код просто не збереться, доки всі гілки не будуть оброблені.
Це кардинально відрізняється від підходу, де default або else «прикриває» забуті випадки й дозволяє помилці піти в продакшн.
Гарантована повнота: як компілятор ловить забуті кейси
Rust змушує розробника бути вичерпним. Якщо enum має, скажімо, три варіанти, то match повинен:
- або мати три окремі гілки — по одній на кожен варіант;
- або мати шаблони, які в сумі покривають усі можливі значення.
Якщо цього немає, компілятор зупиняє збірку з чітким повідомленням про те, що деякі варіанти не оброблені. Таким чином:
- неможливо «забути» новий варіант enum після його додавання;
- немає «тихих» шляхів виконання, які не були явно продумані;
- логіка роботи з переліками стає прозорішою й передбачуванішою.
Це особливо важливо в системному та конкурентному програмуванні, де некоректна обробка станів може призвести до важковідтворюваних збоїв.
Рефакторинг як діалог із компілятором
Повнота match напряму впливає на те, як у Rust відбувається рефакторинг. Коли розробник змінює enum — додає новий варіант або змінює існуючий — компілятор фактично стає навігатором по всьому коду:
- кожне місце, де цей enum використовується в
match, перевіряється на повноту; - усі «зламані» місця перетворюються на компіляторні помилки;
- поки всі вони не виправлені, про успішну збірку не може бути й мови.
Практичний ефект: щоб завершити рефакторинг, достатньо послідовно виправляти помилки компіляції, доки вони не зникнуть. Це знижує ризик пропустити якусь гілку логіки в розгалуженому коді, що особливо цінно в великих проєктах і бібліотеках.
Надійність як вбудована властивість мови
Такий підхід до розгалужень — частина ширшої філософії Rust: якомога більше помилок мають виявлятися на етапі компіляції, а не в рантаймі. Обов’язкова повнота match:
- підсилює надійність коду;
- робить зміни в типах більш контрольованими;
- допомагає підтримувати великі кодові бази без прихованих «дір» у логіці.
У результаті розробник отримує не просто синтаксичну альтернативу switch, а інструмент, який структурно унеможливлює цілий клас типових помилок.
Джерело
YouTube: https://www.youtube.com/watch?v=FUbAgAE6Fh0


