J’utilise toujours un compteur pour vérifier le premier élément ( i==0
) dans une boucle:
i = 0 my_array.each do |item| if i==0 # do something with the first item end # common stuff i += 1 end
Existe-t-il une manière plus élégante de le faire (peut-être une méthode)?
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-le sur ideone .
Utiliser each_with_index
, comme d’autres l’ont décrit, fonctionnerait bien, mais pour des raisons 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 avec le premier élément que vous pourriez 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
Les tableaux ont une méthode “each_with_index” qui est pratique pour cette situation:
my_array.each_with_index do |item, i| item.do_something if i==0 #common stuff end
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
each_with_index
from Enumerable (Enumerable est déjà mélangé avec Array, vous pouvez donc l’appeler sur un tableau sans aucun problème):
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]
Si vous n’avez pas besoin du tableau par la suite:
ar = %w(reversed hello world) puts ar.shift.upcase ar.each{|item| puts item.reverse} #=>REVERSED #=>olleh #=>dlrow
Enumerable#inject
de Ruby fournit un argument qui peut être utilisé pour faire quelque chose différemment lors de la première itération d’une boucle:
> l=[1,2,3,4] => [1, 2, 3, 4] > l.inject(0) {|sum, elem| sum+elem} => 10
L’argument n’est pas ssortingctement nécessaire pour les choses courantes comme les sums et les produits:
> l.inject {|sum, elem| sum+elem} => 10
Mais quand vous voulez faire quelque chose de différent lors de la première itération, cet argument pourrait vous être utile:
> puts fruits.inject("I like to eat: ") {|acc, elem| acc << elem << " "} I like to eat: apples pears peaches plums oranges => nil
Voici une solution qui n’a pas besoin d’être dans une boucle immédiatement fermée et évite la redondance de la spécification d’un espace réservé de statut plus d’une fois sauf si vous en avez vraiment besoin.
do_this if ($first_time_only ||= [true]).shift
Son étendue correspond au titulaire: $first_time_only
sera globalement une fois; @first_time_only
sera une fois pour l’instance et first_time_only
sera une fois pour l’étendue actuelle.
Si vous voulez le premier plusieurs fois, etc., vous pouvez facilement mettre [1,2,3]
si vous avez besoin de distinguer laquelle de vos premières itérations, ou même quelque chose de spécial [1, false, 3, 4]
si vous avez besoin de quelque chose de bizarre.