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
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.
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
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.