Вступ
Бібліотека Ruby включає модуль Enumerable
, який надає потужні методи, такі як map
, reduce
та select
. Ці функції дозволяють ефективно перетворювати та маніпулювати даними.
До кінця цієї серії ви навчитеся розбивати задачі обробки даних на чіткі, легкі для налагодження та комбіновані етапи. Це зробить ваш код на Ruby більш ефективним, елегантним і надійним.
Цей посібник розглядає основні операції IRB, включаючи визначення методів, використання map
, reduce
і select
.
На основі: цієї книги від Джей Годсе — Ефективне перетворення та маніпулювання даними в Ruby — тип: irb
Почнемо!
Примітка: якщо ви застрягли, будь ласка, подивіться мій репозиторій.
- Визначення простої функції f(x)
def f(x)
x*x
end
f(x)
повертає квадрат числа x
.
- Використання 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]
- Використання 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
для фільтрації непарних чисел з цих п'яти елементів.
reduce
ітерацією перебирає послідовність, додаючи кожне число в масивmemo
, залишаючи тільки останні п'ять чисел.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