mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Optional identity for Enumerable#sum defaults to zero. Closes #5657.
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@4599 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
parent
1dc4cc030f
commit
5241b97709
3 changed files with 17 additions and 2 deletions
|
@ -1,5 +1,7 @@
|
|||
*SVN*
|
||||
|
||||
* Optional identity for Enumerable#sum defaults to zero. #5657 [gensym@mac.com]
|
||||
|
||||
* HashWithIndifferentAccess shouldn't confuse false and nil. #5601 [shugo@ruby-lang.org]
|
||||
|
||||
* Fixed HashWithIndifferentAccess#default #5586 [chris@seagul.co.uk]
|
||||
|
|
|
@ -30,7 +30,14 @@ module Enumerable #:nodoc:
|
|||
#
|
||||
# Also calculates sums without the use of a block:
|
||||
# [5, 15, 10].sum # => 30
|
||||
def sum(&block)
|
||||
#
|
||||
# The default identity (sum of an empty list) is zero.
|
||||
# However, you can override this default:
|
||||
#
|
||||
# [].sum(Payment.new(0)) { |i| i.amount } # => Payment.new(0)
|
||||
#
|
||||
def sum(identity = 0, &block)
|
||||
return identity unless size > 0
|
||||
if block_given?
|
||||
map(&block).sum
|
||||
else
|
||||
|
|
|
@ -44,7 +44,13 @@ class EnumerableTests < Test::Unit::TestCase
|
|||
assert_raise(TypeError) { payments.sum(&:price) }
|
||||
assert_equal 60, payments.sum { |p| p.price.to_i * 2 }
|
||||
end
|
||||
|
||||
|
||||
def test_empty_sums
|
||||
assert_equal 0, [].sum
|
||||
assert_equal 0, [].sum { |i| i }
|
||||
assert_equal Payment.new(0), [].sum(Payment.new(0))
|
||||
end
|
||||
|
||||
def test_index_by
|
||||
payments = [ Payment.new(5), Payment.new(15), Payment.new(10) ]
|
||||
assert_equal(
|
||||
|
|
Loading…
Reference in a new issue