Модуль 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?