Выбрать главу

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