Frage Erzähle das Ende einer Each-Schleife in Ruby


Wenn ich eine Schleife wie

users.each do |u|
  #some code
end

Wo Benutzer ein Hash von mehreren Benutzern ist. Was ist die einfachste Bedingungslogik, um zu sehen, ob Sie auf dem letzten Benutzer im Hash des Benutzers sind und nur bestimmten Code für diesen letzten Benutzer ausführen möchten, so etwas wie

users.each do |u|
  #code for everyone
  #conditional code for last user
    #code for the last user
  end
end

Vielen Dank


75
2017-10-22 20:30


Ursprung


Antworten:


users.each_with_index do |u, index|
  # some code
  if index == users.size - 1
    # code for the last user
  end
end

124
2017-10-22 20:34



Wenn es sich um eine Entweder-Oder-Situation handelt, bei der Sie einen Code für alle anwenden aber der letzte Benutzer und dann ein eindeutiger Code zu nur der letzte Benutzer, eine der anderen Lösungen könnte geeigneter sein.

Sie scheinen jedoch den gleichen Code für alle Benutzer und einige auszuführen zusätzlich Code für den letzten Benutzer. Wenn das der Fall ist, scheint das korrekter zu sein und sagt deutlicher Ihre Absicht aus:

users.each do |u|
  #code for everyone
end

users.last.do_stuff() # code for last user

36
2017-10-22 20:39



Ich denke, ein bester Ansatz ist:

users.each do |u|
  #code for everyone
  if u.equal?(users.last)
    #code for the last user
  end
end

17
2017-10-25 16:53



Hast du es versucht each_with_index?

users.each_with_index do |u, i|
  if users.size-1 == i
     #code for last items
  end
end

8
2017-10-22 20:35



h = { :a => :aa, :b => :bb }
h.each_with_index do |(k,v), i|
  puts ' Put last element logic here' if i == h.size - 1
end

5
2017-10-22 20:38



Manchmal finde ich es besser, die Logik in zwei Teile zu trennen, einen für alle Benutzer und einen für den letzten. Also würde ich so etwas machen:

users[0...-1].each do |user|
  method_for_all_users user
end

method_for_all_users users.last
method_for_last_user users.last

3
2018-04-30 09:07



Sie können den @ meager-Ansatz auch für eine Entweder-Oder-Situation verwenden, in der Sie einen Code für alle Benutzer außer dem letzten Benutzer anwenden und dann einen eindeutigen Code nur für den letzten Benutzer.

users[0..-2].each do |u|
  #code for everyone except the last one, if the array size is 1 it gets never executed
end

users.last.do_stuff() # code for last user

Auf diese Weise brauchen Sie kein Konditional!


3
2017-09-16 13:34