Однострочные if / unless
Часть раздела Логика и управление потоком путешествия по Ruby на Coddy — урок 41 из 56.
Ruby позволяет ставить if и unless в конце одного выражения в качестве однострочного модификатора. Это читается почти как предложение на английском языке.
puts "Adult" if age >= 18
puts "Save your work" unless savedЭто то же самое, что и:
if age >= 18
puts "Adult"
end
unless saved
puts "Save your work"
endОднострочная форма отлично подходит для защитных проверок (guard-style) в начале метода или для разовых условных обновлений внутри цикла:
return if name.nil? || name.empty?
counts = Hash.new(0)
words.each do |w|
counts[w] += 1 unless w.start_with?("#")
endПодобно тернарному оператору, используйте встроенные модификаторы для коротких инструкций. Если тело состоит более чем из одной строки, напишите вместо этого полноценный блок if.
Задание
ЛегкоПрочитайте список целых чисел, разделенных запятыми. Для каждого числа выведите одну строку, но только если число не равно нулю:
- Выведите
positive: <n>еслиn > 0 - Выведите
negative: <n>если не (unless)n >= 0
Обе строки должны использовать форму инлайнового модификатора (без блока if и else). После цикла выведите Skipped zeros: <count>, где count — это количество нулей, также вычисленное без блока if (используйте count).
Для входных данных 3,-2,0,5,0 вывод будет следующим:
positive: 3
negative: -2
positive: 5
Skipped zeros: 2Шпаргалка
Ruby позволяет использовать if и unless в качестве встроенных модификаторов в конце одного выражения:
puts "Adult" if age >= 18
puts "Save your work" unless savedЭто полезно для защитных условий (guard clauses) или простых условных обновлений:
return if name.nil? || name.empty?
counts[w] += 1 unless w.start_with?("#")Используйте встроенные модификаторы только для однострочных выражений; для всего, что длиннее, используйте полный блок if.
Попробуйте сами
numbers = gets.chomp.split(",").map(&:to_i)
# TODO: выведите, используя строчный `if` / `unless` для каждого числа
# TODO: выведите Skipped zeros: <n>, используя count
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
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Повторение: Классификатор оценок