告诉ruby中的.each循环结束

Spl*_*lin 80 ruby each loops ruby-on-rails

如果我有一个循环,如

users.each do |u|
  #some code
end
Run Code Online (Sandbox Code Playgroud)

用户是多个用户的哈希值.什么是最简单的条件逻辑,看你是否在用户哈希中的最后一个用户,并且只想为最后一个用户执行特定的代码,所以像

users.each do |u|
  #code for everyone
  #conditional code for last user
    #code for the last user
  end
end
Run Code Online (Sandbox Code Playgroud)

谢谢

Rap*_*met 137

users.each_with_index do |u, index|
  # some code
  if index == users.size - 1
    # code for the last user
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 我只想补充一点,如果你要遍历一个哈希,你必须把它写成:`users.each_with_index do |(key,value),index | #your code end` (3认同)
  • 这个问题是每次都有条件的.在循环外使用`.last`. (2认同)

mea*_*gar 38

如果这是一个非此即彼/或情况,在那里你将一些代码给所有,但最后一个用户,然后一些独特的代码,只有最后一个用户的另一种解决方案可能更为合适.

但是,您似乎为所有用户运行相同的代码,并为最后一个用户运行一些其他代码.如果是这种情况,这似乎更正确,更清楚地表明您的意图:

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

users.last.do_stuff() # code for last user
Run Code Online (Sandbox Code Playgroud)

  • 不需要条件的+1,如果合适的话.(当然,我在这里做过) (2认同)

Alt*_*gos 18

我认为最好的方法是:

users.each do |u|
  #code for everyone
  if u.equal?(users.last)
    #code for the last user
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 这个答案的问题是如果最后一个用户也出现在列表的早期,那么条件代码将被多次调用. (20认同)

Tej*_*eni 10

你试过each_with_index吗?

users.each_with_index do |u, i|
  if users.size-1 == i
     #code for last items
  end
end
Run Code Online (Sandbox Code Playgroud)


Dig*_*oss 6

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
Run Code Online (Sandbox Code Playgroud)


ric*_*ieg 6

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

user_list = users.each

begin
  while true do
    user = user_list.next
    user.do_something
  end
rescue StopIteration
  user.do_something
end
Run Code Online (Sandbox Code Playgroud)

  • 这并不是解决这个问题的好办法。异常不应被滥用于简单的流量控制,它们适用于“异常”情况。 (6认同)
  • @meagar 很抱歉“来自权威的争论”,但 Matz 不同意你的观点。事实上,“StopIteration”正是为了处理循环退出而设计的。Matz 的书中写道:“这可能看起来很不寻常,因为预期的终止条件而不是意外的异常事件引发了异常。(`StopIteration` 是 `StandardError` 和 `IndexError` 的后代;请注意,它是仅限名称中不包含“错误”一词的异常类。)Ruby 在这种外部迭代技术中遵循 Python。(更多...) (3认同)

cod*_*uby 5

您也可以在非此即彼的情况下使用 @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
Run Code Online (Sandbox Code Playgroud)

这样你就不需要条件了!