Розуміння #each, #map та #reduce: Який метод Enumerable слід використовувати?

pic

Модуль Enumerable в Ruby надає потужні методи для ітерації по колекціях, але вибір правильного методу може бути складним. У цьому пості ми розглянемо методи #each, #map та #reduce, пояснимо їх призначення та надамо реальні приклади, щоб допомогти вам зрозуміти, який метод використовувати в різних ситуаціях.

1. #each: Робоча конячка для ітерацій

  • Що робить: Ітерує по кожному елементу колекції, виконуючи блок для його побічних ефектів.
  • Коли використовувати: Коли ви хочете виконувати дії (наприклад, друк, оновлення), не змінюючи колекцію.
  • Приклад:
[1, 2, 3].each { |num| puts num * 2 }

Вивід: 2, 4, 6.

  • Ключова особливість: Це не трансформує колекцію і повертає оригінальну колекцію.

2. #map: Трансформуйте ваші дані

  • Що робить: Створює новий масив, перетворюючи кожен елемент у колекції.
  • Коли використовувати: Коли ви хочете створити нову колекцію з модифікованими значеннями.
  • Приклад:
doubled = [1, 2, 3].map { |num| num * 2 }  
puts doubled.inspect

Вивід: [2, 4, 6].

  • Ключова особливість: Завжди повертає нову колекцію з трансформованими значеннями.

3. #reduce: Накопичуйте результат

  • Що робить: Об'єднує всі елементи колекції в одне значення, використовуючи акумулятор.
  • Коли використовувати: Коли вам потрібно підрахувати суму, побудувати хеш або згорнути дані.
  • Приклад:
sum = [1, 2, 3].reduce(0) { |acc, num| acc + num }  
puts sum

Вивід: 6.

  • Ключова особливість: Повертає одне значення, а не колекцію.

4. Реальні сценарії використання

  • Сценарій 1: Вам потрібно надіслати електронні листи користувачам. Використовуйте #each.
users.each { |user| send_email(user) }
  • Сценарій 2: Вам потрібно подвоїти всі ціни в списку. Використовуйте #map.
doubled_prices = prices.map { |price| price * 2 }
  • Сценарій 3: Вам потрібно підрахувати загальний дохід. Використовуйте #reduce.
total_revenue = revenues.reduce(0) { |sum, revenue| sum + revenue }

5. Загальні помилки

  • Використання #each, коли краще підійшли б #map або #reduce.
  • Забування про те, що #map повертає нову колекцію і не змінює оригінальну.
  • Невірне використання #reduce для операцій, які краще виконати за допомогою #map (наприклад, трансформацій).

Висновок

Вибір правильного методу з Enumerable критичний для написання зрозумілого та ефективного коду на Ruby. Використовуйте #each для побічних ефектів, #map для трансформацій та #reduce для накопичення. Опановуючи ці методи, ви зробите ваш код чистішим, швидшим і більш підтримуваним.

Слідкуйте за моєю наступною статтею про #select, #reject та #find — ваші основні методи для фільтрації колекцій, як професіонал!

Перекладено з: Understanding #each, #map, and #reduce: Which Enumerable Method Should You Use?

Leave a Reply

Your email address will not be published. Required fields are marked *