Ітератори в Ruby є однією з ключових особливостей мови, які значно полегшують роботу з колекціями, такими як масиви (arrays) та хеші (hashes). Вони дозволяють проходити по елементах колекції і виконувати певні дії над кожним з них.
Основні ітератори
Метод .each
Метод .each
є найбільш використовуваним ітератором. Він проходить через кожен елемент колекції і передає його в блок коду.
array = [1, 2, 3, 4, 5]
array.each do |element|
puts element
end
Метод .map
Метод .map
проходить через кожен елемент колекції, виконує над ним операцію і повертає нову колекцію з результатами цих операцій.
array = [1, 2, 3, 4, 5]
squared_array = array.map { |element| element ** 2 }
puts squared_array.inspect # [1, 4, 9, 16, 25]
Метод .select
Метод .select
проходить через кожен елемент колекції і повертає нову колекцію, яка містить тільки ті елементи, для яких блок коду повернув true
.
array = [1, 2, 3, 4, 5]
even_numbers = array.select { |element| element.even? }
puts even_numbers.inspect # [2, 4]
Інші ітератори
Методи .find
та .detect
Метод .find
(або його синонім .detect
) повертає перший елемент колекції, для якого блок коду повертає true
.
array = [1, 2, 3, 4, 5]
first_even = array.find { |element| element.even? }
puts first_even # 2
Метод .reject
Метод .reject
є протилежністю .select
. Він повертає нову колекцію, яка містить всі елементи, для яких блок коду повернув false
.
array = [1, 2, 3, 4, 5]
non_even_numbers = array.reject { |element| element.even? }
puts non_even_numbers.inspect # [1, 3, 5]
Методи .reduce
або .inject
Метод .reduce
(або його синонім .inject
) застосовується для зведення (агрегації) елементів колекції в одне значення.
array = [1, 2, 3, 4, 5]
sum = array.reduce(0) { |accum, element| accum + element }
puts sum # 15
Блоки і Лямбди
Ruby використовує блоки для ітерації. Блоки можуть бути передані як параметри методам. Вони визначаються в фігурних дужках {}
або ключовими словами do...end
.
array.each { |element| puts element } # коротка форма блоку
array.each do |element| # довга форма блоку
puts element
end
Лямбди є ще одним способом визначення блоків коду. Вони зручні для створення анонімних функцій.
my_lambda = ->(x) { x * 2 }
result = my_lambda.call(10)
puts result # 20
Створення власних ітераторів
В Ruby можна створювати власні ітератори, використовуючи метод Enumerator
.
class MyCollection
def initialize
@items = [1, 2, 3, 4, 5]
end
def each
@items.each { |item| yield item }
end
end
collection = MyCollection.new
collection.each { |item| puts item }
У цьому прикладі метод each
викликає блок для кожного елемента масиву @items
.
Заключення
Ітератори в Ruby дозволяють легко і зручно виконувати операції над елементами колекцій, спрощуючи код і підвищуючи його читабельність. Використання ітераторів робить Ruby однією з найулюбленіших мов програмування для розробників, які цінують лаконичний і зрозумілий код.