如果该块从不更改累加器,为什么不减少返回初始值?

戴维·波多

考虑以下irb循环:

irb(main):015:0> [nil, nil].reduce(0) { |accum, x| accum + 1 unless x.nil? }
=> nil

为什么返回nil而不是0呢?

根据Ruby Enumerable文档:

如果指定一个块,则对于枚举中的每个元素,该块将传递一个累加器值(memo)和该元素。如果改为指定符号,则集合中的每个元素都将传递给备忘录的命名方法。无论哪种情况,结果都将成为备忘的新值。在迭代结束时,备忘录的最终值是该方法的返回值。

我的期望是,在0数组开始折叠之前,应将累加器设置为,因为这是作为初始值给出的。然后,该块的转义子句将为该数组中的所有元素触发,因此累加器将永远不会改变。最后,由于0是为累加器存储的最后一个值,因此应将其返回。

丹尼尔·斯佩兰斯基(Danil Speransky)

无论块返回什么,都将成为下一个累加器值。

然后您返回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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么减少累加器不返回预期的总和结果?

如果未给出初始值,则reduce方法将累加器设置为数组的第一项

为什么我的reduce函数中的累加器不采用回调的返回值?

haskell初始累加器“ null”值

如果没有匹配的累加器,RxJS如何减少?

Java 8减少累加器返回类型

如果将对象设置为新变量,为什么会保存该变量的初始值?

如果没有collect(),为什么累加器上的操作不起作用?

该程序在累加器中缺少什么步骤?

为什么不能在.reduce()函数中将推入的结果返回到累加器?

为什么我的减速累加器复位?

使用复数累加器折叠/减少

用元组累加器减少推力

为什么不减少短路?

如何在Julia中初始化减少和使用累加器

为什么在创建新订阅时重置扫描累加器值,而在使用shareReplay(1)时却不重置?

减少以在提供初始值的同时返回特定值

在Python中返回累加器的函数

为什么useContext()不返回Provider值,而是返回初始值?

Haskell组根据累加器值

火花累加器值未增加

使用对象作为累加器的数组减少

减少并映射到累加器上会产生堆栈溢出

Javascript减少方法创建累加器对象

Java 流减少功能。累加器的结合性

为什么如果使用初始值设定项不正确?

如果初始值超出返回的默认远程数据,Kendo Dropdown 初始值将丢失

为什么Array.prototype.reduce()不将空数组用作累加器?

为什么带有累加器的示例代码会引发异常?