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Строки: подробный разбор
Обзор методов строкИнтерполяция строкПеребор строкРазделение и объединениеПовторение — String Weaver4Блоки, Proc и Lambda
Что такое блок?do..end и фигурные скобкиКлючевое слово yieldПараметры блокаProc и LambdaПовторение — пользовательский итератор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Повторение — конвейер данных8Продвинутый выбор решений
Case с классами и Regexwhen с несколькими значениямиТернарный операторСтрочные if / unlessПовторение — классификатор оценок3Двумерные массивы
Основы двумерных массивовДоступ к элементам двумерного массиваПеребор двумерных массивовРаспространённые шаблоны для двумерных массивовПовторение — операции с матрицами6Проект — Менеджер библиотеки
Обзор проектаДобавление книгиПотренируйтесь самостоятельно: Онлайн-компилятор Ruby