用 Ruby 表示每个循环的结尾

如果我有一个循环,比如

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
69949 次浏览
users.each_with_index do |u, index|
# some code
if index == users.size - 1
# code for the last user
end
end

Did you tried 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

If it's an either/or situation, where you're applying some code to all but the last user and then some unique code to only the last user, one of the other solutions might be more appropriate.

However, you seem to be running the same code for all users, and some additional code for the last user. If that's the case, this seems more correct, and more clearly states your intent:

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


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

I think a best approach is:

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

There are no last method for hash for some versions of 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

Another solution is to rescue from StopIteration:

user_list = users.each


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

Sometimes I find it better to separate the logic to two parts, one for all users and one for the last one. So I would do something like this:

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


method_for_all_users users.last
method_for_last_user users.last

You can use @meager's approach also for an either/or situation, where you're applying some code to all but the last user and then some unique code to only the last user.

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

This way you don't need a conditional!