ActiveSupport Enumerable#sum should not use #size

T

Trans

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.
 
S

Stefan Lang

2008/3/7 said:
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

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
 
D

Drew Olson

Stefan said:
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, &:+)


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
 
S

Stefan Lang

2008/3/7 said:
Stefan said:
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, &:+)


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

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

Stefan
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,764
Messages
2,569,564
Members
45,041
Latest member
RomeoFarnh

Latest Threads

Top