2017-01-15 2 views
0

I diese Zeile habenRails injizieren() funktioniert nicht auf eine Anordnung von einem Element

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

die die Gesamtstreckenlauf in week[1] erhält, die eine Reihe von Datensätzen Jog ist. Dies funktioniert, wenn mehrere Datensätze sind, aber wenn es nur ein für diese Woche ist, gibt inject einfach den Datensatz selbst, nicht seine Entfernung ..

Gibt es eine Möglichkeit für inject auf Arrays von Einzelstücken zu arbeiten, die gleichen als größere Arrays?

Antwort

3

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.

+0

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

Verwandte Themen