diff --git a/ChangeLog b/ChangeLog index bb68d89789..1aa6a398e3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +Tue May 17 23:08:00 2016 Kenta Murata + + * enum.c (enum_sum): [DOC] Write documentation. + Tue May 17 22:53:00 2016 Kenta Murata * enum.c (enum_sum): Implement Enumerable#sum. diff --git a/enum.c b/enum.c index 157b615d99..56d304c7a9 100644 --- a/enum.c +++ b/enum.c @@ -3668,6 +3668,32 @@ enum_sum_iter_i(RB_BLOCK_CALL_FUNC_ARGLIST(i, args)) /* + * call-seq: + * enum.sum(init=0) -> number + * enum.sum(init=0) {|e| expr } -> number + * + * Returns the sum of elements in an Enumerable. + * + * If a block is given, the block is applied to each element + * before addition. + * + * If enum is empty, it returns init. + * + * For example: + * + * { 1 => 10, 2 => 20 }.sum {|k, v| k * v } #=> 50 + * (1..10).sum #=> 55 + * (1..10).sum {|v| v * 2 } #=> 110 + * [Object.new].each.sum #=> TypeError + * + * This method can be used for non-numeric objects by + * explicit init argument. + * + * { 1 => 10, 2 => 20 }.sum([]) #=> [1, 10, 2, 20] + * "a\nb\nc".each_line.lazy.map(&:chomp).sum("") #=> "abc" + * + * Enumerable#sum method may not respect method redefinition of "+" + * methods such as Integer#+. */ static VALUE enum_sum(int argc, VALUE* argv, VALUE obj)