ActiveSupport Enumerable#sum should not use #size

ActiveSupport defines this for Enumerable#sum:

module Enumerable

def sum(identity = 0, &block)
  return identity unless size > 0

  if block_given?
    map(&block).sum
  else
    inject { |sum, element| sum + element }
  end
end

end

The use of #size shouldn’t be used in an Enumerable method --since it
is not part of Enumerable’s defined interface… Ah, I was just
about to ask what anyone thought the fix to this is, but it occurs to
me that it might be:

def sum(identity = 0, &block)
  if block_given?
    map(&block).sum
  else
    inject { |sum, element| sum + element } || identity
  end
end

Look right?

T.

2008/3/7, Trans [email protected]:

    inject { |sum, element| sum + element }
def sum(identity = 0, &block)
  if block_given?
    map(&block).sum
  else
    inject { |sum, element| sum + element } || identity

inject takes the identity as first parameter:

inject(identity) { |sum, element| sum + element }

and since they define Symbol#to_proc, this can even be

inject(identity, &:+)
  end
end

Look right?

T.

Stefan

Stefan L. wrote:

inject takes the identity as first parameter:

inject(identity) { |sum, element| sum + element }

and since they define Symbol#to_proc, this can even be

inject(identity, &:+)
  end
end

Look right?

T.

Stefan

This is very concise, but doesn’t have the same behavior as the original
sum. This will start any sum with the identity and then build on it from
there. Not that this is incorrect behavior, it’s just different from
what was originally defined. For example:

a = [1,2,3]

original sum, with identity = 10, would return 6, whereas your version
would return 16.

  • Drew

2008/3/7, Drew O. [email protected]:

end

sum. This will start any sum with the identity and then build on it from
there. Not that this is incorrect behavior, it’s just different from
what was originally defined. For example:

a = [1,2,3]

original sum, with identity = 10, would return 6, whereas your version
would return 16.

  • Drew

Hm, right. I find the name “identity” misleading in this case.

Stefan