Rails inject()不适用于一个项目的数组

问题描述 投票:0回答:1

我有这条线

week[1].inject{ |sum, jog| jog.distance }

这得到了week[1]的总距离,这是Jog记录的数组。当有多个记录时,这可以工作,但如果那个星期只有一个,inject只返回记录本身,而不是它的距离。

inject有没有办法处理单个项目的数组,就像更大的数组一样?

ruby-on-rails ruby ruby-on-rails-5
1个回答
3
投票

来自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

以另一种方式解决问题。如果您不需要单个记录,也可以在数据库中执行此操作。

© www.soinside.com 2019 - 2024. All rights reserved.