Map, Reduce та Select в Ruby

Вступ

Бібліотека Ruby включає модуль Enumerable, який надає потужні методи, такі як map, reduce та select. Ці функції дозволяють ефективно перетворювати та маніпулювати даними.

До кінця цієї серії ви навчитеся розбивати задачі обробки даних на чіткі, легкі для налагодження та комбіновані етапи. Це зробить ваш код на Ruby більш ефективним, елегантним і надійним.

Цей посібник розглядає основні операції IRB, включаючи визначення методів, використання map, reduce і select.

pic

На основі: цієї книги від Джей Годсе — Ефективне перетворення та маніпулювання даними в Ruby — тип: irb

Почнемо!

Примітка: якщо ви застрягли, будь ласка, подивіться мій репозиторій.

  1. Визначення простої функції f(x)
def f(x)  
 x*x  
end

f(x) повертає квадрат числа x.

  1. Використання MAP для трансформації — завдання map() полягає в тому, щоб застосувати функцію або блок до кожного елемента масиву і повернути новий масив.

Застосування функції до масиву

out_array = [1,2,3,4,5].map do |n|  
 f(n)  
end
=> [1, 4, 9, 16, 25]

Альтернативно, за допомогою блоку:

out_array = [1,2,3,4,5].map { |n| n*n }
=> [1, 4, 9, 16, 25]

Мапінг з кількома значеннями

out_array = [1,2,3,4,5].map { |n| [n, n*n] }
=> [[1, 1], [2, 4], [3, 9], [4, 16], [5, 25]]

Ланцюжок викликів map

out_array = [1,2,3,4,5].map do |n| n*n  
 end.map do |s| s+100  
end
=> [101, 104, 109, 116, 125]
  1. Використання REDUCE для накопичення — завдання reduce() полягає в тому, щоб застосувати функцію до кожного елемента колекції та повернути об'єкт (це може бути масив, одне значення, хеш або що завгодно).

Сума елементів

[1,2,3,4,5].reduce(0,:+)
=> 15

Синтаксис reduce

[1,2,3,4,5].reduce(33) do |memo, elem|  
 memo.+(elem)  
end
=> 48

Обробка побічних ефектів у reduce

[1,2,3,4,5].reduce(33) do |memo, elem|  
 memo.+(elem)  
 77.7 # Завжди повертається 77.7  
end
=> 77.7

Використання reduce з хешами

[1,2,3,4,5].reduce({}) do |memo, elem|  
 memo[elem] = elem.to_s  
 memo  
end
=> {1=>"1", 2=>"2", 3=>"3", 4=>"4", 5=>"5"}

Використання reduce для обчислення факторіала

[1,2,3,4,5].reduce(1,:*)
=> 120

Використання reduce для відстеження останніх двох елементів

ini_memo = [nil, nil]
=> [nil, nil]
last_2=(1..10).reduce(ini_memo) do |memo, elem|  
 ini_memo.push(elem)  
 ini_memo.shift  
 ini_memo  
end
=> [9, 10]

Використання reduce і select для пошуку непарних чисел серед останніх п'яти в послідовності

sequence = [1,2,3,455,5,6,4,3,45,66,77,54,23,4,55,6,7]
=> [1, 2, 3, 455, 5, 6, 4, 3, 45, 66, 77, 54, 23, 4, 55, 6, 7]
sequence.reduce([nil,nil,nil,nil,nil]) do |memo, n|  
 memo.push(n)  
 memo.shift  
 memo  
end.select do |odds_of_last_5|  
 odds_of_last_5 %2 == 1  
end
=> [23, 55, 7]

Цей код використовує reduce, щоб підтримувати останні п'ять елементів послідовності та select для фільтрації непарних чисел з цих п'яти елементів.

  1. reduce ітерацією перебирає послідовність, додаючи кожне число в масив memo, залишаючи тільки останні п'ять чисел.
  2. select фільтрує ці останні п'ять чисел, повертаючи тільки непарні.

Остаточний результат: [23, 55, 7] — це непарні числа з останніх п'яти елементів послідовності.

Висновок

Цей посібник охоплює основні операції IRB, включаючи визначення методів, використання map для трансформацій та використання reduce для накопичення.
Розуміючи ці функції, ви зможете ефективно маніпулювати даними та налагоджувати помилки в Ruby.

Щасливого кодування! 🚀

Подяки та посилання

Книга: Ruby Data Processing — Using Map, Reduce, and Select Джей Годсе (Jay Godse)

Схожі пости

0–1–2–3–4–5–6–7–8–9–10

Перекладено з: Map, Reduce & Select in Ruby