[1, 2, 3, 4].inject(0) { |result, element| result + element } # => 10
I\'m looking at this code but my brain is not registering how the number 1
inject
takes a value to start with (the 0
in your example), and a block, and it runs that block once for each element of the list.
result + element
). The easiest way to explain this may be to show how each step works, for your example; this is an imaginary set of steps showing how this result could be evaluated:
[1, 2, 3, 4].inject(0) { |result, element| result + element }
[2, 3, 4].inject(0 + 1) { |result, element| result + element }
[3, 4].inject((0 + 1) + 2) { |result, element| result + element }
[4].inject(((0 + 1) + 2) + 3) { |result, element| result + element }
[].inject((((0 + 1) + 2) + 3) + 4) { |result, element| result + element }
(((0 + 1) + 2) + 3) + 4
10