Про ітератори в Ruby (Iterator)

Ітератори в 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 однією з найулюбленіших мов програмування для розробників, які цінують лаконичний і зрозумілий код.