74 votes

Comment agir différemment à la première itération dans une boucle Ruby?

J'utilise toujours un compteur pour vérifier le premier élément ( i==0 ) d'une boucle:

 i = 0
my_array.each do |item|
  if i==0
    # do something with the first item
  end
  # common stuff
  i += 1
end
 

Y a-t-il une manière plus élégante de faire ceci (peut-être une méthode)?

75voto

detunized Points 8559

Tu peux le faire:

 my_array.each_with_index do |item, index|
    if index == 0
        # do something with the first item
    end
    # common stuff
end
 

Essayez sur ideone .

47voto

Russell Points 5472

Utiliser each_with_index , comme d'autres l'ont décrit, fonctionnerait très bien, mais par souci de variété, voici une autre approche.

Si vous voulez faire quelque chose de spécifique pour le premier élément seulement et quelque chose de général pour tous les éléments, y compris le premier, vous pouvez faire:

 # do something with my_array[0] or my_array.first
my_array.each do |e| 
  # do the same general thing to all elements 
end
 

Mais si vous ne voulez pas faire la chose générale avec le premier élément, vous pouvez le faire:

 # do something with my_array[0] or my_array.first
my_array.drop(1).each do |e| 
  # do the same general thing to all elements except the first 
end
 

3voto

Toby Hede Points 22128

Les tableaux ont une méthode « each_with_index » qui est très pratique pour cette situation :

3voto

undur_gongor Points 7431

Ce qui convient le mieux est en fonction de la situation.

Une autre option (si vous savez que votre tableau n'est pas vide):

 # treat the first element (my_array.first)
my_array.each do | item |
   # do the common_stuff
end
 

2voto

Telemachus Points 12013

each_with_index de Enumerable (Enumerable est déjà mélangé à Array, vous pouvez donc l'appeler sans problème sur un tableau):

 irb(main):001:0> nums = (1..10).to_a
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
irb(main):003:0> nums.each_with_index do |num, idx|
irb(main):004:1* if idx == 0
irb(main):005:2> puts "At index #{idx}, the number is #{num}."
irb(main):006:2> end
irb(main):007:1> end
At index 0, the number is 1.
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X