Comment agir différemment sur la première itération dans un Rubis boucle?
J'ai toujours utiliser 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
Est-il une façon plus élégante de le faire (peut-être une méthode)?
- Pourquoi tout le monde vote pour fermer cette? C'est une véritable question.
- Ce qui ne vous empêche dans ce cas de faire ce que vous avez besoin avec le premier élément dans le tableau, puis de faire un normal
each
boucle avec juste le commun des trucs? - S'il fait quelque chose de spécial pour le premier élément (avec
array.first
ouarray[0]
), puis exécute l'each
boucle, il faudra encore de test pour le premier article s'il ne veut pas faire la chose régulière sur le premier élément aussi. - Oui mais dans l'exemple ci-dessus, il ne veux faire de la commune de trucs sur le premier élément. Et si il ne le fait pas, ne pouvait-il pas juste de faire
my_array[1..-1].each
? - Je pense que Russell de traiter avec le premier élément en dehors de la boucle, et ensuite une boucle à partir du deuxième élément.
- Dans l'exemple ci-dessus le commun des trucs qui va arriver à tous les éléments, y compris le premier élément. Si vous avez besoin de faire des choses différentes pour les différents éléments qu'il ne sonne pas comme un très bon candidat pour le code dans une boucle... donc je pense que l'avoir à l'extérieur de la boucle a plus de sens.
- stackoverflow.com/questions/2241684/... c'est une question semblable.
- double possible de Faire quelque chose de spécial la première fois dans un Rubis boucle
Vous devez vous connecter pour publier un commentaire.
Vous pouvez faire ceci:
Essayer sur ideone.
.each_with_index
au lieu de.each
. Le.drop(1)
les suggestions ci-dessous semble plus proche de ruby et évite les indices tout à fait.À l'aide de
each_with_index
, comme d'autres l'ont décrit, pourrait fonctionner très bien, mais pour le bien de variété ici est une autre approche.Si vous voulez faire quelque chose de spécifique pour le premier élément, et quelque chose de plus général pour tous les éléments, y compris la première, vous pourriez faire:
Mais si vous ne voulez pas faire la chose générale avec le premier élément que vous pouvez faire:
my_array.drop(1)
il est plus déclaratif.drop
. Il est beaucoup plus agréable.Tableaux ont une "each_with_index" la méthode, ce qui est pratique pour ce genre de situation:
Ce qui convient le mieux est fonction de la situation.
Une autre option (si vous connaissez votre tableau n'est pas vide):
each_with_index
de Énumérable (Énumérable est déjà mélangé avec de Tableau, de sorte que vous pouvez l'appeler sur un tableau, sans aucun problème):Si vous n'avez pas besoin de la matrice par la suite:
else
quelque part. Mais il fait quoi le titre de la question dit.Ruby
Énumérable#injecter
fournit un argument qui peut être utilisé pour faire quelque chose de différent sur la première itération d'une boucle:L'argument n'est pas strictement nécessaire pour des choses ordinaires comme des sommes et des produits:
Mais quand vous voulez faire quelque chose différents à la première itération, cet argument pourrait être utile pour vous:
inject
est que je ne pense pas qu'il répond à l'OPs à une question qui était de savoir comment faire quelque chose de différent pour la première itération de la boucle uniquement.inject
s'adapte à ce qu'il demande, mais peut-être que vous avez vu quelque chose que nous avons manqué. Il veut faire quelque chose différentes la première fois à travers un tableau. Soni += 1
est un manuel de contre, pas une somme.inject
et j'ai oublié que le point de l'ensemble de l'argument était en train de faire quelque chose de différent à la première itération. Merci.inject
trop...Voici une solution qui n'a pas besoin d'être dans un immédiatement en joignant boucle et évite la redondance de l'indication d'un état de l'espace réservé plus d'une fois, à moins que vous vraiment besoin de.
Son champ d'application correspond à la titulaire:
$first_time_only
sera globalement la fois;@first_time_only
sera une fois de l'instance, etfirst_time_only
sera une fois de l'étendue actuelle.Si vous souhaitez que la première plusieurs fois, etc, vous pouvez facilement mettre
[1,2,3]
si vous avez besoin de distinguer les premières itérations vous êtes, ou même quelque chose de fantaisie[1, false, 3, 4]
si vous avez besoin de quelque chose de bizarre.