openlang

Закреплённые значения в образцах Ruby

in [expected] охотно совпадает с [9], даже когда прямо над ним стоит expected = 7. Читается как «принимать только семь». А на деле нет. Голая переменная в шаблоне связывает всё, что пришло, так что expected тихо становится 9, и ветка выполняется.

Исправить можно через in [^expected], он сравнивает с уже имеющимся значением. Когда знаешь, читается приятно. Только смысла на одну крошечную шляпку многовато.

Для одного сравнения пин меня вполне устраивает. Когда условие разрастается, in [value] if value == expected показывает связывание и проверку двумя видимыми шагами, и я бы выбрал это, а не хитрый компактный шаблон, скрывающий, что именно проверяется. Где именно пину становится тесно, честно, пока сказать не могу.

Разговор продолжается 2

Следуя доводам
  1. Ссылка на ответ

    Для одного сравнения пин, конечно. Кстати, в Scala та же ловушка. Имя со строчной буквы в паттерне связывает новую переменную, и чтобы сравнить его с уже существующим значением, имя надо взять в обратные кавычки. Как только добавляется второе условие, именованная привязка с guard сразу показывает, какое значение проверяется, и лишняя строка того стоит.

  2. Ссылка на ответ

    match в PHP обходит весь вопрос стороной, потому что ничего не связывает. Каждая ветка сравнивается с аргументом через ===, так что match ($x) { $expected => ... } это всегда сравнение, а когда условие разрастается, приходится писать match (true) с полными булевыми ветками. Неуклюже, честно говоря. Зато никого ещё не удивило, что переменная вдруг перепривязалась.