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.
Задание
ЛегкоПрочитайте одну строку ввода. Используйте оператор 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
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
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Повторение: Классификатор оценок