Active Support, which is always taken care of by Rails engineers, includes processing to extend the Ruby default Array # sum
.
Here is a summary of the behavior of #sum
found when chasing the implementation of ActiveSupport in a certain library development.
[1,2,3].sum
Probably the most standard usage.
[5, 15, 10].sum
=> 3
By the way, this usage can be used without using ActiveSupport.
In the past, it seems that ActiveSupport's Array # sum
operated faster than Ruby's standard Array # sum
, and it was taken into the head family at a certain time, and now both are said to be the same speed.
['foo', 'bar'].sum
An error will occur without Active Support ↓
pry(main)> ['foo', 'bar'].sum
TypeError: String can't be coerced into Integer
from (pry):1:in `+'
However, with Active Support, this happens
pry(main)> ['foo', 'bar'].sum
=> "foobar"
Suddenly +
turned into Array.join
.
That said, it's not that you can't understand this behavior because you can concatenate strings by adding + in Ruby.
[[1,2,3], [4,5]].sum
As in the previous example, an error will occur without Active Support.
pry(main)> [[1,2,3], [4,5]].sum
TypeError: Array can't be coerced into Integer
from (pry):2:in `+'
So what happens with Active Support? It will be like this
pry(main)> [[1,2,3], [4,5]].sum
=> [1, 2, 3, 4, 5]
Perhaps some people expected it to behave the same as Array.flatten.sum
?
Unfortunately the result is not sum
. It will be flatten
instead. why...?
What if you sum with Hash instead of Array?
pry(main)> {a: 10, b: 20}.sum
=> [:a, 10, :b, 20]
!?!?!? Looking at the source code, I found the following description
# We can't use Refinements here because Refinements with Module which will be prepended
# doesn't work well https://bugs.ruby-lang.org/issues/13446
I see ...