Menu
Coddy logo textTech

Цепочки 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. Узнавайте его, когда увидите.

challenge icon

Задание

Легко

Прочитайте список слов, разделенных запятыми. Выведите в одну строку слова длиннее 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
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком