考虑以下irb循环:
irb(main):015:0> [nil, nil].reduce(0) { |accum, x| accum + 1 unless x.nil? }
=> nil
为什么返回nil
而不是0
呢?
根据Ruby Enumerable文档:
如果指定一个块,则对于枚举中的每个元素,该块将传递一个累加器值(memo)和该元素。如果改为指定符号,则集合中的每个元素都将传递给备忘录的命名方法。无论哪种情况,结果都将成为备忘的新值。在迭代结束时,备忘录的最终值是该方法的返回值。
我的期望是,在0
数组开始折叠之前,应将累加器设置为,因为这是作为初始值给出的。然后,该块的转义子句将为该数组中的所有元素触发,因此累加器将永远不会改变。最后,由于0
是为累加器存储的最后一个值,因此应将其返回。
无论块返回什么,都将成为下一个累加器值。
然后您返回nil
:
'whatever' unless true #=> nil
您可以这样做:
arr.reduce(0) { |a, e| e.nil? ? a : a + 1 }
或这个:
arr.compact.reduce(0) { |a, e| a + 1 }
或这个:
arr.compact.size
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句