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

ParameterTypeDefaultDescription
initialObjectnilStarting 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

See Also