Цепочки Map
Часть раздела Логика и управление потоком путешествия по Ruby на Coddy — урок 22 из 56.
Вы познакомились с map в основах, он создает новый массив, преобразуя каждый элемент. Его настоящая мощь проявляется, когда вы объединяете его в цепочку с select, reject и им подобными.
Каждый метод возвращает массив, поэтому вызов следующего метода для полученного результата позволяет строить цепочки вызовов:
numbers = [1, 2, 3, 4, 5]
result = numbers
.select { |n| n.odd? }
.map { |n| n * 10 }
puts result.inspect # [10, 30, 50]Читайте цепочку сверху вниз: начните с чисел, оставьте нечётные, умножьте каждое на 10. Без временных переменных, без цикла.
Сокращение &:method_name работает всякий раз, когда блок просто вызывает один метод:
["hi", "yo"].map { |s| s.upcase } # ["HI", "YO"]
["hi", "yo"].map(&:upcase) # ["HI", "YO"] (то же самое)Это сокращение встречается повсюду в коде Ruby. Узнавайте его, когда увидите.
Задание
ЛегкоПрочитайте список слов, разделенных запятыми. Выведите в одну строку слова длиннее 3 символов в верхнем регистре, разделенные , .
Постройте это в виде одной цепочки: select длинные слова, map их с помощью &:upcase, затем join.
Для входных данных hi,hello,yo,coddy,sup результатом будет:
HELLO, CODDYШпаргалка
Цепочки методов массивов — каждый из них возвращает новый массив, поэтому вы можете продолжать вызывать методы для полученного результата:
numbers = [1, 2, 3, 4, 5]
result = numbers
.select { |n| n.odd? }
.map { |n| n * 10 }
# [10, 30, 50]Используйте &:method_name как сокращение, когда блок просто вызывает один метод:
["hi", "yo"].map(&:upcase) # ["HI", "YO"]Попробуйте сами
words = gets.chomp.split(",")
# TODO: объединить в цепочку select + map(&:upcase) + join
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
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Повторение: Классификатор оценок