0Pricing
Ruby Academy · Урок

reduce и each_with_object

Агрегируйте коллекции

«reduce и each_with_object» — бесплатный урок Ruby Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Ruby Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Ruby Academy содержит 4 уроков всего.

Что такое reduce

reduce (псевдоним inject) объединяет все элементы в одно значение. Блок получает накопитель и текущий элемент.

sum = [1, 2, 3, 4].reduce(0) { |acc, n| acc + n }
puts sum

Как работает накопитель

Накопитель хранит текущий результат между итерациями. Результат, возвращённый блоком, становится следующим значением накопителя.

[1, 2, 3].reduce(0) do |acc, n|
  puts "acc=#{acc} n=#{n}"
  acc + n
end

reduce без начального значения

Если начальное значение не задано, первый элемент становится накопителем, а перебор начинается со второго элемента.

puts [10, 20, 30].reduce { |acc, n| acc + n }

reduce с символом

Для простых операторов вместо блока передайте символ, например :+ или :*.

puts [1, 2, 3, 4].reduce(:+)
puts [1, 2, 3, 4].reduce(:*)

Поиск максимального значения

reduce может вычислять не только суммы, но и другие значения, например находить наибольшее значение.

nums = [3, 9, 2, 7]
max = nums.reduce { |acc, n| n > acc ? n : acc }
puts max

Построение строки

Накопитель может иметь любой тип, в том числе быть строкой, которую Вы постепенно создаёте.

letters = ["r", "u", "b", "y"]
word = letters.reduce("") { |acc, c| acc + c.upcase }
puts word

Что такое each_with_object

each_with_object похож на reduce, но ему передаётся изменяемый объект, который возвращается автоматически. Вы изменяете этот объект внутри блока.

result = [1, 2, 3].each_with_object([]) do |n, arr|
  arr << n * 2
end
puts result.inspect

Построение хеша

each_with_object идеально подходит для построения хешей, поскольку Вам не нужно возвращать объект на каждой итерации.

words = ["apple", "pear"]
lengths = words.each_with_object({}) do |w, h|
  h[w] = w.length
end
puts lengths

Подсчёт вхождений

Объедините хеш со значением по умолчанию и each_with_object, чтобы подсчитывать элементы.

votes = ["a", "b", "a", "a"]
tally = votes.each_with_object(Hash.new(0)) do |v, h|
  h[v] += 1
end
puts tally

reduce и each_with_object

Используйте reduce, когда каждый шаг возвращает новое значение (суммы, произведения). Используйте each_with_object, когда изменяете один контейнер (массив или хеш).

puts [1, 2, 3].reduce(:+)
puts [1, 2, 3].each_with_object([]) { |n, a| a << n }.inspect

Сокращённая запись для подсчёта

Для подсчёта в Ruby есть встроенный метод tally, который выполняет эту работу за Вас.

puts ["a", "b", "a"].tally

Быстрая проверка

Проверьте свои навыки агрегирования.

Повторение

Теперь Вы умеете агрегировать коллекции:

  • reduce/inject с накопителем, начальным значением или символом
  • each_with_object для построения массивов и хешей
  • tally для быстрого подсчёта
  • выбирайте reduce для новых значений, а each_with_object — для изменяемых контейнеров

Следующий курс: числа и математика.

puts (1..5).reduce(:*)

Часто задаваемые вопросы

Урок «reduce и each_with_object» бесплатный?

Да — полный текст урока «reduce и each_with_object» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Ruby Academy, подпишись на CoddyKit PRO. Курс Ruby Academy содержит 4 уроков всего.

Чему я научусь в уроке «reduce и each_with_object»?

Агрегируйте коллекции Ты практикуешь Ruby Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Ruby Academy?

Предыдущий опыт не требуется. Ruby Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «reduce и each_with_object»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Ruby Academy?

Да. Каждый урок Ruby Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Создание диапазонов
  2. Модуль Enumerable
  3. map, select, reject
  4. reduce и each_with_object
← Назад к Ruby Academy