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