我有这条线
week[1].inject{ |sum, jog| jog.distance }
这得到了week[1]
的总距离,这是Jog
记录的数组。当有多个记录时,这可以工作,但如果那个星期只有一个,inject
只返回记录本身,而不是它的距离。
inject
有没有办法处理单个项目的数组,就像更大的数组一样?
来自fine manual:
注入(初始,sym)→obj 注入(sym)→obj inject(initial){| memo,obj | block}→obj 注入{| memo,obj | block}→obj [...] 如果没有为memo显式指定初始值,那么集合的第一个元素将用作memo的初始值。
因此,如果a
是一个单元素数组,那么:
a.inject { anything_at_all }
相当于
a.first
这种行为实际上只是一个快捷方式,可以:
a.inject(:+)
这么快就容易说出来。
如果你需要你的块总是运行那么你只需要提供initial
值并确保你的块完成它需要做的事情:
week[1].inject(0) { |sum, jog| sum + jog.distance }
# -------------^ ^^^^^
# -----------------------------^^^^^
如果没有块中的sum +
,你最终会得到week[1].distance
(假设你当然提供了0
初始值)。
你也可以这样说:
week[1].map(&:distance).inject(:+)
week[1].map(&:distance).sum
以另一种方式解决问题。如果您不需要单个记录,也可以在数据库中执行此操作。