Ruby Inject and Ruby Reduce

Rich Steinmetz
Rich Steinmetz
Ruby Inject and Ruby Reduce

I've heard about inject for the first time when I started to work with Ruby after about 5 years of coding in JavaScript, Python and Java. It turned out that inject is just a fancy name for the reduce() function (many rubyists prefer inject though, so that reduce is just a fancy name for inject to them).

Just in case you wonder, "Why do I have to stuff my brain with multiple names for the exact same method?"... Because we can!

Why is it called inject?

You could think of it as elements from a collection being sent somewhere with an operation injected in between:

You could also view it as a collection of elements being injected into one whole:

Martin Fowler in his blog post on reduce, kind of indicates that inject comes from smalltalk, where it’s called inject:into:. I'm not sure about the exact Why, though. Just don't mix it up with "dependency injection" or the mathematical "injective function", they don't have much in common.

Why is it called reduce?

This one's pretty intuitive and also more known in the world of data (think MapReduce) and other languages (think Python, JS etc.). Basically, you have a collection of Something and you reduce this collection to one entity.

Pitfalls

Ruby inject / reduce default values

I'm not sure if I have that from some other language from back in the old days, when I still happily used reduce, but one day I was banging my head for some time hunting a nasty "bug":

[1, 2, 3].inject { |sum_so_far, current_item| sum_so_far + current_item + 1 }
=> 8 # supposed to be 9 in my brain

Must be definitely a Ruby compiler bug! However, in nearly 100% of the cases, those are internal read-the-docs-brain-bugs. As you can see, there's no default value to start out when you don't provide an argument to inject. Instead, the first value to be operated on is the first element in the collection.



Join the conversation.

Great! Check your inbox and click the link
Great! Next, complete checkout for full access to Rich Stone Input Output
Welcome back! You've successfully signed in
You've successfully subscribed to Rich Stone Input Output
Success! Your account is fully activated, you now have access to all content
Success! Your billing info has been updated
Your billing was not updated