Raconte la fin d’une boucle .each dans ruby

Si j’ai une boucle telle que

users.each do |u| #some code end 

Où les utilisateurs sont un hachage de plusieurs utilisateurs. Quelle est la logique conditionnelle la plus simple pour voir si vous êtes sur le dernier utilisateur du hachage utilisateur et que vous souhaitez uniquement exécuter un code spécifique pour ce dernier utilisateur, par exemple

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

Merci

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

S’il s’agit d’une situation particulière, où vous appliquez du code à tous les utilisateurs sauf le dernier utilisateur, puis un code unique au dernier utilisateur, l’une des autres solutions peut être plus appropriée.

Cependant, vous semblez exécuter le même code pour tous les utilisateurs et du code supplémentaire pour le dernier utilisateur. Si tel est le cas, cela semble plus correct et indique plus clairement votre intention:

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

Je pense qu’une meilleure approche est la suivante:

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

Avez-vous essayé 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 

Parfois, je trouve préférable de séparer la logique en deux parties, une pour tous les utilisateurs et une pour le dernier. Donc je ferais quelque chose comme ça:

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

Vous pouvez également utiliser l’approche de @meager pour l’une ou l’autre des situations, où vous appliquez du code à tous les utilisateurs sauf le dernier utilisateur, puis un code unique au dernier utilisateur.

 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 

De cette façon, vous n’avez pas besoin d’un conditionnel!

Une autre solution consiste à sortir de StopIteration:

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

Il n’y a pas de dernière méthode pour le hash pour certaines versions de 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