Bird
Raised Fist0
Rubyprogramming~5 mins

Reduce/inject for accumulation in Ruby

Choose your learning style10 modes available
Introduction

Reduce (also called inject) helps you combine all items in a list into one value, like adding numbers or joining words.

When you want to add all numbers in a list to get a total.
When you want to multiply all numbers together to get a product.
When you want to join all words in an array into a sentence.
When you want to find the biggest or smallest number in a list.
When you want to combine data from many items into one result.
Syntax
Ruby
array.reduce(initial_value) { |accumulator, item| 
  # combine accumulator and item
}

# or using inject (same as reduce)
array.inject(initial_value) { |accumulator, item| 
  # combine accumulator and item
}

The accumulator starts with initial_value and updates with each item.

You can omit initial_value, then the first item is used as the start.

Examples
Adds all numbers starting from 0, result is 10.
Ruby
[1, 2, 3, 4].reduce(0) { |sum, n| sum + n }
Multiplies all numbers starting from 1, result is 24.
Ruby
[1, 2, 3, 4].inject(1) { |product, n| product * n }
Joins all letters into "abc" starting from empty string.
Ruby
["a", "b", "c"].reduce("") { |str, ch| str + ch }
Finds the biggest number without initial value, result is 8.
Ruby
[5, 3, 8, 2].reduce { |max, n| n > max ? n : max }
Sample Program

This program shows how to add numbers, multiply them, join words, and find the biggest number using reduce/inject.

Ruby
numbers = [10, 20, 30, 40]
sum = numbers.reduce(0) { |total, num| total + num }
product = numbers.inject(1) { |total, num| total * num }
words = ["Ruby", " ", "is", " ", "fun"]
sentence = words.reduce("") { |str, word| str + word }
max_num = numbers.reduce { |max, num| num > max ? num : max }

puts "Sum: #{sum}"
puts "Product: #{product}"
puts "Sentence: '#{sentence}'"
puts "Max number: #{max_num}"
OutputSuccess
Important Notes

Reduce and inject are the same method; you can use either name.

Always think about what your starting value (initial_value) should be.

If you forget the initial value, the first item is used as the start, so the block runs one less time.

Summary

Reduce/inject combines all items in a list into one value.

You provide a starting value and a block to tell how to combine.

It works great for sums, products, joining strings, or finding max/min.

Practice

(1/5)
1. What does the Ruby method inject do when used on an array?
easy
A. It combines all elements into a single value using a block.
B. It sorts the array in ascending order.
C. It removes duplicate elements from the array.
D. It returns the first element of the array.

Solution

  1. Step 1: Understand the purpose of inject

    The inject method takes all elements of an array and combines them into one value using the block provided.
  2. Step 2: Compare with other options

    Sorting, removing duplicates, or returning the first element are different methods like sort, uniq, or first.
  3. Final Answer:

    It combines all elements into a single value using a block. -> Option A
  4. Quick Check:

    inject combines elements = C [OK]
Hint: Remember: inject reduces many to one value [OK]
Common Mistakes:
  • Confusing inject with sorting methods
  • Thinking inject returns an array
  • Assuming inject removes duplicates
2. Which of the following is the correct syntax to sum all elements in an array arr using inject?
easy
A. arr.inject { |sum, n| sum / n }
B. arr.inject(0) { |sum, n| sum + n }
C. arr.inject(1) { |sum, n| sum * n }
D. arr.inject { |sum, n| sum - n }

Solution

  1. Step 1: Identify the correct initial value and operation

    To sum elements, start with 0 and add each element: inject(0) { |sum, n| sum + n }.
  2. Step 2: Check other options

    arr.inject { |sum, n| sum - n } subtracts, C multiplies starting at 1, A divides. Only D sums correctly.
  3. Final Answer:

    arr.inject(0) { |sum, n| sum + n } -> Option B
  4. Quick Check:

    Sum with inject = D [OK]
Hint: Sum needs 0 start and + inside block [OK]
Common Mistakes:
  • Starting sum with 1 instead of 0
  • Using wrong operation like subtraction
  • Omitting initial value causing errors
3. What is the output of this Ruby code?
numbers = [2, 3, 4]
result = numbers.inject(1) { |product, n| product * n }
puts result
medium
A. Error
B. 9
C. 10
D. 24

Solution

  1. Step 1: Understand the initial value and operation

    The initial value is 1, and each element multiplies the accumulator: 1*2=2, 2*3=6, 6*4=24.
  2. Step 2: Calculate the final product

    The final result after all multiplications is 24.
  3. Final Answer:

    24 -> Option D
  4. Quick Check:

    2*3*4 = 24 [OK]
Hint: Multiply with inject starts at 1 [OK]
Common Mistakes:
  • Adding instead of multiplying
  • Starting with 0 causing zero result
  • Confusing output with sum
4. Identify the error in this code snippet:
arr = [1, 2, 3]
sum = arr.inject { |total, n| total + n }
puts sum
medium
A. No error; code works fine.
B. Missing initial value causes incorrect sum.
C. Block parameters are reversed.
D. inject cannot be used without a symbol.

Solution

  1. Step 1: Check if initial value is required

    When no initial value is given, inject uses the first element as the start and iterates from the second element.
  2. Step 2: Verify the sum calculation

    It correctly sums 1 + 2 + 3 = 6 without error.
  3. Final Answer:

    No error; code works fine. -> Option A
  4. Quick Check:

    inject without initial value sums correctly = A [OK]
Hint: inject uses first element as start if no initial value [OK]
Common Mistakes:
  • Assuming initial value is always required
  • Thinking block parameters order is wrong
  • Believing inject needs symbol argument
5. Given an array of hashes representing products with keys :name and :price, how can you use inject to find the total price of all products?
products = [
  { name: "Book", price: 12 },
  { name: "Pen", price: 3 },
  { name: "Notebook", price: 7 }
]
hard
A. products.inject { |total, product| total + product.name }
B. products.inject(1) { |total, product| total * product[:price] }
C. products.inject(0) { |total, product| total + product[:price] }
D. products.inject(0) { |total, product| total + product.price }

Solution

  1. Step 1: Access the price key correctly

    Each product is a hash, so access price with product[:price].
  2. Step 2: Sum prices starting at 0

    Start with 0 and add each price to get total price.
  3. Step 3: Check other options

    products.inject { |total, product| total + product.name } uses dot notation which is invalid for hashes, C multiplies prices, D uses dot notation again.
  4. Final Answer:

    products.inject(0) { |total, product| total + product[:price] } -> Option C
  5. Quick Check:

    Sum prices with inject and hash keys = B [OK]
Hint: Use hash keys with [:key] inside inject block [OK]
Common Mistakes:
  • Using dot notation for hash keys
  • Multiplying prices instead of summing
  • Starting sum at 1 instead of 0
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard