【发布时间】:2012-09-21 05:39:03
【问题描述】:
我正在计算一个项目在枚举中出现的次数。
irb(main):003:0> (1..3).reduce(0) {|sum, p| sum += 1 if p == 1}
=> nil
irb(main):004:0> (1..3).find_all{|p| p == 1}.length
=> 1
reduce 方法似乎应该与 find_all 方法具有相同的行为。为什么它返回nil 而不是1?
irb(main):023:0> (1..3).reduce(0) {|sum, p| sum += 1 if p == 2}
NoMethodError: undefined method `+' for nil:NilClass
from (irb):23:in `block in irb_binding'
from (irb):23:in `each'
from (irb):23:in `reduce'
from (irb):23
from /usr/bin/irb:12:in `<main>'
第一次迭代出现问题。 reduce就不能这样用吗?
【问题讨论】:
-
当
p不是1时sum += 1 if p == 1的结果是nil。块的结果分配给sum,因此 nil 将覆盖您的sum值。