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
换一种方式解决问题。如果不需要单独的记录,也可以在数据库中进行。
我有这条线
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
换一种方式解决问题。如果不需要单独的记录,也可以在数据库中进行。