1

I am a beginner in Ruby and I came across a code snippet which had the following:

def add(*nums)
  nums.inject(&:+)
end

Examples:

add(1, 2)
#=> 3
add(1, 2, 3, 4)
#=> 10

How does the code snippet work?

Sagar Pandya
  • 9,323
  • 2
  • 24
  • 35
current_user
  • 1,172
  • 1
  • 16
  • 28

3 Answers3

2

As specified in the doc: https://apidock.com/ruby/Enumerable/inject

inject:

Combines all elements of enum by applying a binary operation, specified by a block or a symbol that names a method or operator.

You can use it with enumerable(array, range, ..) like this,

[1, 2, 3].inject { |sum, number| sum + number }

or short-hand style,

[1, 2, 3].inject(&:+)

If you're wondering about this (&:+) and how it works, check this also,

What do you call the &: operator in Ruby?

M. Karim
  • 932
  • 1
  • 9
  • 18
  • 2
    That is normally written `[1, 2, 3].inject(:+)`. Extra credit for explaining the difference between using `&:+` and `:+` as `inject`'s argument. Also, [Enumerable#sum](http://ruby-doc.org/core-2.4.0/Enumerable.html#method-i-sum) made its debut in Ruby v2.4, allowing one to write `[1, 2, 3].sum #= > 6`. – Cary Swoveland Dec 01 '17 at 02:20
1

In the docs it says it works like:

# Same using a block and inject
(5..10).inject { |sum, n| sum + n } #=> 45

https://ruby-doc.org/core-2.4.2/Enumerable.html#method-i-inject

Eg. It is summing up 1,2,3,4 which equals 10

JEMaddux
  • 303
  • 3
  • 14
1

As I have done so in this answer, print each step using puts to see what's going on:

def add(*nums)
  nums.inject { |sum, element|
    puts "",
         "sum is #{sum} and element is #{element}",
         "new sum is #{sum} + #{element} = #{sum + element}",
         "-" * 25
    sum + element
  }
end

add(1, 2, 3, 4)
#sum is 1 and element is 2
#new sum is 1 + 2 = 3
#-------------------------

#sum is 3 and element is 3
#new sum is 3 + 3 = 6
#-------------------------

#sum is 6 and element is 4
#new sum is 6 + 4 = 10
#-------------------------
#=> 10
Sagar Pandya
  • 9,323
  • 2
  • 24
  • 35