ruby-on-rails 在ruby中说出a,each循环的结尾

lymgl2op  于 2023-05-23  发布在  Ruby
关注(0)|答案(9)|浏览(137)

如果我有一个循环,比如

users.each do |u|
  #some code
end

其中users是多个用户的散列。如果你是用户散列中的最后一个用户,并且只想为最后一个用户执行特定代码,那么最简单的条件逻辑是什么

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

vql8enpb1#

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

ruarlubt2#

如果是非此即彼的情况,您将一些代码应用于所有 * 但 * 最后一个用户,然后将一些唯一的代码应用于 * 仅 * 最后一个用户,则其他解决方案之一可能更合适。
但是,您似乎为所有用户运行相同的代码,并为最后一个用户运行一些 * 额外的 * 代码。如果是这样的话,这似乎更正确,更清楚地说明了你的意图:

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

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

vm0i2vca3#

我认为最好的方法是:

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

czq61nw14#

你试过each_with_index吗?

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

2skhul335#

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
kninwzqo

kninwzqo6#

另一个解决方案是从StopIteration中拯救:

user_list = users.each

begin
  while true do
    user = user_list.next
    user.do_something
  end
rescue StopIteration
  user.do_something
end
i86rm4rw

i86rm4rw7#

您还可以将@meager的方法用于非此即彼的情况,即您将一些代码应用于除最后一个用户之外的所有用户,然后将一些唯一的代码应用于最后一个用户。

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

这样你就不需要条件句了!

nhaq1z21

nhaq1z218#

有时候我发现把逻辑分成两部分会更好,一部分用于所有用户,另一部分用于最后一个用户。所以我会这样做:

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

method_for_all_users users.last
method_for_last_user users.last
slwdgvem

slwdgvem9#

对于某些版本的Ruby,没有最后一个哈希方法

h = { :a => :aa, :b => :bb }
last_key = h.keys.last
h.each do |k,v|
    puts "Put last key #{k} and last value #{v}" if last_key == k
end

相关问题