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") # какой-то текстСравните с регулярным выражением, чтобы разветвить логику в зависимости от формы строки (номер телефона, email, дата):
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.
Задание
ЛегкоПрочитайте одну строку ввода. Используйте оператор case, чтобы вывести одну из этих меток в зависимости от того, как выглядит ввод:
- Все цифры:
number - Содержит
@:email - Начинается с заглавной буквы:
name - Что угодно другое:
unknown
Проверяйте правила в указанном порядке (так 123 — это number, а не unknown; kevin@coddy.tech — это email; Alice — это name).
Для ввода kevin@coddy.tech выводимым значением будет email.
Попробуйте сами
input = gets.chomp
# TODO: case input ... when /^\d+$/, /@/, /^[A-Z]/ ... else ... end
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Строки в деталях
Обзор методов строкИнтерполяция строкИтерация по строкамSplit и JoinИтоги — String Weaver4Блоки, Proc и лямбды
Что такое блок?do..end против фигурных скобокКлючевое слово yieldПараметры блокаProc и лямбдыИтоги: пользовательский итератор7Хеши. Часть 2
Hash.new со значениями по умолчаниюИтерация по хешамВложенные хешиСлияние и преобразованиеИтоги — счетчик частоты10Проект — Учёт студентов
Обзор проектаДобавить студента2Диапазоны
Что такое диапазон?Методы диапазоновДиапазоны в Case / WhenПовторение — практика по диапазонам5Мощь Enumerable
Select и RejectЦепочки MapReduce / Injectcount, all?, any?, none?group_by и partitionsort_by, min_by, max_byИтоги — Data Pipeline8Продвинутые условные конструкции
Case с классами и RegexМножественные значения в whenТернарный операторОднострочные if / unlessПовторение: Классификатор оценокПотренируйтесь самостоятельно: Онлайн-компилятор Ruby