在ruby中告诉一个.each循环的结束

如果我有一个循环如

users.each do |u| #some code end 

用户是多个用户的散列。 什么是最简单的条件逻辑,看看你是否在用户哈希中的最后一个用户,只想为最后一个用户执行特定的代码

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

谢谢

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

如果这是一种或者两种情况,那么除了最后一个用户,还有一些代码只适用于最后一个用户,其他解决scheme之一可能更合适。

但是,您似乎正在为所有用户运行相同的代码,并为最后一个用户添加了一些附加代码。 如果是这样,这似乎更正确,更清楚地表明你的意图:

 users.each do |u| #code for everyone end users.last.do_stuff() # code for last user 

我认为最好的办法是:

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

你有没有尝试each_with_index

 users.each_with_index do |u, i| if users.size-1 == i #code for last items end end 
 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 

有时我觉得把逻辑分成两部分是最好的,一部分是所有用户,一部分是最后一部分。 所以我会做这样的事情:

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

你也可以使用@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 

这样你不需要一个条件!

有些版本的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 

另一个解决scheme是从StopIteration救援:

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