Array#inject
inject(initial = nil) { |memo, element| block } -> result Returns:
Object · Updated March 13, 2026 · Array Methods arrays enumerable accumulation fold
inject iterates over an array while maintaining an accumulator value. On each iteration, the block receives the current accumulator (called memo) and the current element. The block return value becomes the new accumulator.
Syntax
array.inject(initial) { |memo, element| block }
array.inject { |memo, element| block }
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
| initial | Object | nil | Starting value for the accumulator. If omitted, first element becomes initial. |
Examples
Summing numbers
numbers = [1, 2, 3, 4, 5]
sum = numbers.inject(0) { |memo, n| memo + n }
puts sum # => 15
sum = numbers.inject { |memo, n| memo + n }
puts sum # => 15
Building a hash
items = [:a, :b, :c]
indexed = items.inject({}) do |memo, item|
memo[item] = item.to_s.upcase
memo
end
puts indexed # => {:a=>"A", :b=>"B", :c=>"C"}
Finding maximum
scores = [23, 87, 45, 92, 67]
max = scores.inject do |memo, score|
memo > score ? memo : score
end
puts max # => 92
Common Patterns
# Start from different initial value
result = [1, 2, 3].inject(10) { |memo, n| memo + n }
puts result # => 16
# Chaining
result = [1, 2, 3, 4, 5, 6]
.select(&:even?)
.inject(0) { |memo, n| memo + n }
puts result # => 18
Errors
# Empty without initial returns nil
[].inject { |m, e| m + e } # => nil
# Empty with initial returns initial
[].inject(0) { |m, e| m + e } # => 0