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
endreduce без начального значения
Если начальное значение не задано, первый элемент становится накопителем, а перебор начинается со второго элемента.
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 tallyreduce и 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 — локальная установка не требуется.
Все уроки этого курса
- Создание диапазонов
- Модуль Enumerable
- map, select, reject
- reduce и each_with_object