Statement "case"

Оператор case - это удобный способ написания нескольких условных выражений, которые обычно приводят к громоздким операторам if...elsif.

Операторы case обрабатывают каждое условие по очереди, и если условие возвращает false, они переходят к следующему, пока не будет найдено совпадение. В случае отсутствия совпадения можно указать блок else, который будет использоваться по умолчанию.

grade = 'F'

result = case grade
when 'A' then "Excellent!"
when 'B', 'C' then "Good job!"
when 'D' then "Pass."
when 'F' then "Fail."
else "Unknown grade"
end

puts result
#=> Fail.

Если необходимо выполнить более сложные манипуляции с кодом, можно удалить ключевое слово then и вместо этого разместить код для выполнения на следующей строке -

grade = 'C'

case grade
when 'A'
puts "Excellent!"
pay_extra(10)
when 'B', 'C'
puts "Good job!"
pay_extra(5)
when 'D'
puts "Pass."
when 'F'
puts "Fail."
else
puts "Unknown grade"
end

#=> Good job!


Начиная с версии 2.7 в Ruby появился дополнительный синтаксис для оператора case - Pattern Matching. Используется ключевое слово in вместо when, и оно предназначено для более сложного анализа структур данных.

def example(data)
case data
in [Integer, String]
puts "Received an array with an integer and a string"
in {name: name, age: age}
puts "Received a hash: name is #{name}, age is #{age}"
else
puts "No match found"
end
end

example([1, "hello"]) # output: Received an array with an integer and a string
example({name: "Alice", age: 30}) # output: Received a hash: name is Alice, age is 30