if и unless
Оператор if можно использовать для проверки условия; если оно истинно (то есть не равно nil и не false), то оператор внутри него выполняется. Вы можете использовать else, чтобы добавить действие, если условие неверно. Посмотрите это, например:
secret_number = rand(1..5) # Случайное целое число от 1 до 5
print "Пожалуйста, введите свое предположение:"
guess = read_line.to_i
if guess == secret_number
puts "Вы правильно догадались!"
else
puts "Извините, номер был #{secret_number}."
end
Условное выражение не обязательно должно быть выражением, результатом которого является логическое значение (true или false). Любое значение, кроме ложных, нулевых и нулевых указателей (подробнее об указателях см. в Главе 7, «C Функциональная совместимость»), будет считаться правдивым. Обратите внимание, что нулевые и пустые строки также являются правдивыми.
Противоположностью if является unless. Его можно использовать, когда вы хотите отреагировать, когда условие является false или nil. Посмотрите это, например:
unless guess.in? 1..5
puts "Пожалуйста, введите число от 1 до 5."
end
Оператор if также может содержать блок else, но в этом случае всегда лучше изменить порядок на обратный и использовать последовательность if-else.
И if, и unless можно записать в одну строку, вставив ее после действия. В некоторых случаях это более читабельно. Предыдущий пример аналогичен этому:
puts "Пожалуйста, введите число от 1 до 5." unless guess.in? 1..5
Вы можете объединить несколько операторов if, используя один или несколько блоков elsif. Это уникально для if и не может использоваться с unless. Посмотрите это, например:
if !guess.in? 1..5
puts "Пожалуйста, введите число от 1 до 5."
elsif guess == secret_number
puts "Вы правильно угадали!"
else
puts "Извините, номер был #{secret_number}."
end
Как вы часто увидите в Crystal, эти операторы также можно использовать как выражения; они выдадут последний оператор выбранной ветки. Вы даже можете использовать блок if в середине присваивания переменной:
msg = if !guess.in? 1..5
"Пожалуйста, введите число от 1 до 5."
elsif guess == secret_number
"Вы правильно угадали!"
else
"Извините, номер был #{secret_number}."
end
puts msg
Это может быть полезно, чтобы избежать повторения или выполнить сложную логику внутри другого выражения. Существует также сокращенная версия, если использовать условие ? истинное утверждение : структура ложного утверждения. Это часто называют тройным:
puts "Вы догадались #{guess == secret_number ? "правильно" : "неправильно"}!"
Часто вы не смотрите на проверку условных операторов, а вместо этого выбираете один из нескольких вариантов. Здесь на помощь приходит оператор case, объединяющий длинную последовательность операторов if.
case
case похож на оператор if, но позволяет определить несколько возможных результатов в зависимости от заданного значения. Вы указываете оператор case с некоторым значением и одним или несколькими вариантами, проверяющими различные возможности. Вот структура:
case Time.local.month
when 1, 2, 3
puts "Мы в первом квартале"
when 4, 5, 6
puts "Мы во втором квартале"
when 7, 8, 9
puts "Мы в третьем квартале"
when 10, 11, 12
puts "Мы в четвертом квартале"
end
Это прямой эквивалент гораздо более длинной и менее читаемой последовательности операторов if:
month = Time.local.month
if month == 1 || month == 2 || month == 3
puts "Мы в первом квартале"
elsif month == 4 || month == 5 || month == 6
puts "Мы во втором квартале"
elsif month == 7 || month == 8 || month == 9
puts "Мы в третьем квартале"
elsif month == 10 || month == 11 || month == 12
puts "Мы в четвертом квартале"
end
Оператор case также можно использовать с диапазонами:
case Time.local.month
when 1..3
puts "Мы в первом квартале"
when 4..6
puts "Мы во втором квартале"
when 7..9