Скажите конец. каждый цикл в 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
спасибо
9 ответов:
users.each_with_index do |u, index| # some code if index == users.size - 1 # code for the last user end end
Если это либо/или ситуация, где вы применяете некоторый код ко всем но последнего пользователя, а затем какой-то уникальный код только последний пользователь, одно из других решений может быть более подходящим.
однако, похоже, вы используете один и тот же код для всех пользователей, а некоторые дополнительные код для последнего пользователя. Если это так, то это кажется более правильным, и более четко заявляет о своем намерении:
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таким образом, вам не нужно условное!
другое решение состоит в том, чтобы спасти от StopIteration:
user_list = users.each begin while true do user = user_list.next user.do_something end rescue StopIteration user.do_something end
нет последнего метода для хэша для некоторых версий 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
Comments