Rails inject() 不适用于包含一项的数组

Rails inject() doesn't work on an array of one item

我有这条线

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

得到week[1]中的总距离运行,是Jog条记录的数组。这在有多个记录时有效,但如果那一周只有一个记录,inject 只是 returns 记录本身,而不是它的距离..

inject 有什么方法可以处理单个项目的数组,就像处理更大的数组一样吗?

来自fine manual

inject(initial, sym) → obj
inject(sym) → obj
inject(initial) { |memo, obj| block } → obj
inject { |memo, obj| block } → obj
[...]
If you do not explicitly specify an initial value for memo, then the first element of collection is used as the initial value of 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

换一种方式解决问题。如果不需要单独的记录,也可以在数据库中进行。