Vom fine manual:
inject (initial, sym) → obj
inject (sym) → obj
inject (initial) {| Memo, OBJ | Block} → obj
injizieren {| memo, obj | block} → obj
[...]
Wenn Sie nicht explizit einen anfänglichen Wert für Memo angeben, dann das erste Element der Sammlung wird als Anfangswert von Memo verwendet.
Also, wenn a
ist ein ein Element Array dann:
a.inject { anything_at_all }
entspricht
a.first
Dieses Verhalten ist wirklich nur eine Verknüpfung machen Dinge wie:
a.inject(:+)
und so schnell und einfach zu sagen.
Wenn Sie Ihren Block müssen immer dann laufen Sie nur den initial
Wert liefern müssen und stellen Sie sicher, dass Ihr Block tut, was es tun muss:
week[1].inject(0) { |sum, jog| sum + jog.distance }
# -------------^ ^^^^^
# -----------------------------^^^^^
Ohne die sum +
im Block werden Sie nur Am Ende mit week[1].distance
(vorausgesetzt, Sie haben natürlich den Anfangswert 0
geliefert).
Man könnte auch sagen etwas wie:
week[1].map(&:distance).inject(:+)
week[1].map(&:distance).sum
das Problem eine andere Art und Weise zu lösen. Sie können dies auch in der Datenbank tun, wenn Sie die einzelnen Datensätze nicht benötigen.
Danke, das hat mir wirklich geholfen zu verstehen, warum ich 'inject (0)' viel in der Vergangenheit gesehen habe! Am Ende habe ich herausgefunden, dass Rails eine bestimmte 'sum'-Methode hat, also war mein endgültiger Code' week [1] .sum {| jog | jog.distance} ' – Mirror318