Menu
Coddy logo textTech

Case с классами и Regex

Часть раздела Логика и управление потоком путешествия по Ruby на Coddy — урок 38 из 56.

Вы использовали case с диапазонами. Тот же оператор также сопоставляется с классами и регулярными выражениями: оба через оператор ===, который when вызывает «под капотом».

Сопоставляйте по классу, чтобы ветвить логику в зависимости от типа полученного значения:

def describe(value)
  case value
  when Integer then "a whole number"
  when Float   then "a decimal"
  when String  then "some text"
  else              "something else"
  end
end

puts describe(42)      # целое число
puts describe(3.14)    # десятичное число
puts describe("hi")    # какой-то текст

Используйте сопоставление с регулярным выражением для ветвления по форме строки, номеру телефона, адресу электронной почты или дате:

def kind_of(text)
  case text
  when /^\d+$/        then "all digits"
  when /@/            then "looks like an email"
  when /^[A-Z]/       then "starts with a capital"
  else                     "other"
  end
end

Это гораздо чище, чем цепочка вызовов is_a? или match? в if/elsif.

challenge icon

Задание

Легко

Прочитайте одну строку ввода. Используйте оператор case, чтобы вывести одну из этих меток в зависимости от того, на что похож ввод:

  • Только цифры, number
  • Содержит @: email
  • Начинается с заглавной буквы, name
  • Все остальное, unknown

Проверяйте правила в указанном порядке (так, 123 — это number, а не unknown; kevin@coddy.tech — это email; Alice — это name).

Для ввода kevin@coddy.tech выводом будет email.

Шпаргалка

В Ruby case/when выполняет сопоставление с классами и регулярными выражениями, используя === «под капотом».

Сопоставление по классу:

case value
when Integer then "a whole number"
when Float   then "a decimal"
when String  then "some text"
else              "something else"
end

Сопоставление по регулярному выражению:

case text
when /^\d+$/   then "all digits"
when /@/       then "looks like an email"
when /^[A-Z]/  then "starts with a capital"
else                "other"
end

Попробуйте сами

input = gets.chomp

# TODO: case input ... when /^\d+$/, /@/, /^[A-Z]/ ... else ... end
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком