Давно программируете на Ruby? Тогда наверняка сталкивались с мини-драмой двух ключевых слов потока управления: if и unless. Это как две стороны одной медали: if — вечный оптимист, а unless — немного скептик. Разберем отличия этих двух звезд Ruby, приправим щепоткой юмора и избавимся от путаницы условных конструкций.
Знакомьтесь: оптимист if
Это классический поток управления. if применяется, когда условие истинно. Очень просто. Это как друг, который всегда говорит: «Конечно, если будет солнечно, пойдем гулять!»
if sunny
puts "Let's go out and enjoy the sun!"
end
В этом коде, если sunny истинно, идем насладиться прекрасной погодой. А если нет? Скоротаем день за просмотром Netflix на диване.
Появляется скептик unless
А этот друг всегда думает, что стакан наполовину пуст. Применяется, только когда условие ложно. unless говорит: «Выйду, только если не будет дождя».
unless raining
puts "Let's go out and enjoy the sun!"
end
Поэтому, если raining ложно, пойдем загорать. Если raining истинно, останемся дома. С unless логика обратная: этот друг идеален для случаев, где акцентируется то, чему происходить нежелательно.
Незаметные отличия: потому что не все так просто
1. Удобство восприятия
Здесь начинается самое интересное. if обычно интуитивно понятнее, потому что людям привычнее мыслить утвердительно. Но с unless код удобнее для восприятия с отрицательными условиями. Например, сравните эти:
if !sunny
puts "Better grab an umbrella!"
end
# и
unless sunny
puts "Better grab an umbrella!"
end
Какое удобнее для восприятия? Версия unless обычно понятнее, когда речь идет об отрицательных условиях. Это как быстрый способ сказать: «Не хочу этого делать; сделаю, только если…». Надеюсь, понятно.
2. Нюансы: вложенная логика не годится
Жизнь не всегда проста, условные конструкции тоже. Если вложить unless в if или наоборот, вопросов будет больше, чем ответов.
if user_signed_in
unless admin
puts "Welcome, user!"
end
end
Это совершенно допустимо, но пощадите читателей вашего кода — упростите его. Когда что-то начинает походить на логическую головоломку, обычно предпочтительнее использовать if.
3. Модификаторы: маленький помощник
В Ruby имеется все для чистого, элегантного кода. Как модификаторы используются и if, и unless:
puts "Welcome, guest!" if user.nil?
puts "Welcome, guest!" unless user
Здесь ими выполняется одно и то же, но выбор между if и unless сводится к тому, как задается условие. В позитивном ключе? Применяйте if. Немного негативном? Тогда unless.
Когда использовать if, а когда — unless: шпаргалка
- Применяйте
if, когда проверяете истинность. - Применяйте
unless, когда проверяете ложность, особенно если код от этого становится удобнее для восприятия. - Избегайте
unlessпри многих условиях. Это все равно что пытаться играть в шахматы в уме — быстро запутаетесь.
# Хорошо:
puts "Welcome!" unless user_signed_in
# Плохо:
unless user_signed_in && account_active
puts "You can't access this page."
end
Видите? С unless здесь слишком сложно. Когда условий много, используйте if.
Заключение:
В Ruby if и unless — две стороны одной медали. if применяется в большинстве сценариев, unless — отличный помощник, когда акцентируется нежелательность происходящего. Выбирайте то, с чем код станет понятнее, удобнее для вас самих и ваших коллег. Практикуйтесь в написании кода, и пусть условные конструкции всегда будут четкими.
Читайте также:
- Почему стоит использовать Ruby on Rails
- Новичкам на заметку: реализация шаблона Singleton в Ruby
- Операторы Ruby: звездочка * и двойная звездочка **
Читайте нас в Telegram, VK и Дзен
Перевод статьи Melihciray: Ruby Showdown: unless vs. if – The Ultimate Face-Off!





