Wenn ich eine Schleife wie habe
users.each do |u|
#some code
end
Wobei Benutzer ein Hash mehrerer Benutzer ist. Was ist die einfachste bedingte Logik, um zu sehen, ob Sie sich auf dem letzten Benutzer im Benutzer-Hash befinden und nur bestimmten Code für diesen letzten Benutzer ausführen möchten, also so etwas wie
users.each do |u|
#code for everyone
#conditional code for last user
#code for the last user
end
end
ruby-on-rails
ruby
loops
each
Splashlin
quelle
quelle
each_with_index
oderlast
Methoden.Hash
mischt in Enumerable, so hat eseach_with_index
. Selbst wenn die Hash-Schlüssel nicht sortiert sind, wird diese Art von Logik beim Rendern von Ansichten immer wieder angezeigt, wobei das letzte Element möglicherweise anders angezeigt wird, unabhängig davon, ob es in einem datenrelevanten Sinne tatsächlich "zuletzt" ist.each_with_index
, Entschuldigung. Ja, ich kann sehen, dass es kommen würde; Ich versuche nur, die Frage zu klären. Persönlich ist die beste Antwort für mich die Verwendung von,.last
aber das gilt nicht für einen Hash, nur ein Array.Antworten:
quelle
.last
außerhalb der Schleife.users.each_with_index do |(key, value), index| #your code end
Wenn es sich um eine Entweder-Oder-Situation handelt, in der Sie Code auf alle außer dem letzten Benutzer und dann eindeutigen Code nur auf den letzten Benutzer anwenden, ist möglicherweise eine der anderen Lösungen besser geeignet.
Sie scheinen jedoch für alle Benutzer denselben Code und für den letzten Benutzer zusätzlichen Code auszuführen. Wenn dies der Fall ist, scheint dies korrekter zu sein und Ihre Absicht klarer auszudrücken:
quelle
.last
der nichts mit Schleifen zu tun hat..last
. Die Sammlung ist bereits instanziiert, es ist nur ein einfacher Zugriff auf ein Array. Selbst wenn die Sammlung noch nicht geladen worden wäre (wie in, es war immer noch eine nicht hydratisierte ActiveRecord-Beziehung), werdenlast
niemals Schleifen ausgeführt , um den letzten Wert zu erhalten. Dies wäre äußerst ineffizient. Es ändert einfach die SQL-Abfrage, um den letzten Datensatz zurückzugeben. Diese Sammlung wurde jedoch bereits von der geladen.each
, sodass keine größere Komplexität erforderlich ist als bei Ihnenx = [1,2,3]; x.last
.Ich denke, ein bester Ansatz ist:
quelle
u.equal?(users.last)
, dieequal?
Methode vergleicht die object_id, nicht den Wert des Objekts. Dies funktioniert jedoch nicht mit Symbolen und Zahlen.Hast du es versucht
each_with_index
?quelle
quelle
Manchmal finde ich es besser, die Logik in zwei Teile zu unterteilen, einen für alle Benutzer und einen für den letzten. Also würde ich so etwas machen:
quelle
Sie können den Ansatz von @ meager auch für eine Entweder-Oder-Situation verwenden, in der Sie Code auf alle außer dem letzten Benutzer und dann eindeutigen Code nur auf den letzten Benutzer anwenden.
Auf diese Weise brauchen Sie keine Bedingung!
quelle
users[0..-2]
ist richtig, wie es istusers[0...-1]
. Beachten Sie die verschiedenen Bereichsoperatoren..
vs...
, siehe stackoverflow.com/a/9690992/67834Eine andere Lösung ist die Rettung vor StopIteration:
quelle
StopIteration
ist für den genauen Grund der Behandlung von Schleifenausgängen ausgelegt. Aus Matz 'Buch: "Dies mag ungewöhnlich erscheinen - eine Ausnahme wird für eine erwartete Beendigungsbedingung und nicht für ein unerwartetes und außergewöhnliches Ereignis ausgelöst. (StopIteration
Ist ein Nachkomme vonStandardError
undIndexError
; beachten Sie, dass es eine der wenigen Ausnahmeklassen ist, die das Wort nicht haben." "Fehler" in seinem Namen.) Ruby folgt Python in dieser externen Iterationstechnik. (Mehr ...)next
auf einen speziellen Wert für das Ende der Iteration zu überprüfen , und es ist nicht erforderlich, vor dem Aufruf einnext?
Prädikat aufzurufennext
. "loop do
implizit ist,rescue
wenn man auf a trifftStopIteration
; Es wird speziell verwendet, wenn einEnumerator
Objekt extern iteriert wird.loop do; my_enum.next; end
wird iterierenmy_enum
und am Ende beenden; keine Notwendigkeit, dort ein zu setzenrescue StopIteration
. (Sie müssen, wenn Siewhile
oder verwendenuntil
.)Für einige Ruby-Versionen gibt es keine letzte Hash-Methode
quelle
last
, ist der Schlüsselsatz ungeordnet, sodass diese Antwort sowieso falsche / zufällige Ergebnisse liefert.