84 votes

Ruby each_with_index offset

Puis-je définir le décalage de l'index dans l'itérateur de boucle each_with_index? Ma tentative directe a échoué:

 some_array.each_with_index{|item, index = 1| some_func(item, index) }
 

Modifier:

Précision: je ne veux pas d’un tableau de décalage, je veux que l’index dans chaque each_with_index ne commence pas à 0 mais par exemple à 1.

110voto

Mladen Jablanović Points 22082

En fait, Enumerator#with_index reçoit l'offset comme paramètre optionnel:

 [:foo, :bar, :baz].to_enum.with_index(1).each do |elem, i|
  puts "#{i}: #{elem}"
end
 

les sorties:

 1: foo
2: bar
3: baz
 

BTW, je pense que ce n'est là que dans 1.9.2.

50voto

Zack Xu Points 1531

Ce qui suit est succinct, en utilisant la classe Ruby's Enumerator.

 [:foo, :bar, :baz].each.with_index(1) do |elem, i|
    puts "#{i}: #{elem}"
end
 

sortie

 1: foo
2: bar
3: baz
 

Array # chacun renvoie un énumérateur et l'appel de Enumerator # with_index renvoie un autre énumérateur auquel un bloc est transmis.

5voto

sawa Points 62592

1) Le plus simple est de remplacer index+1 au lieu de index de la fonction:

some_array.each_with_index{|item, index| some_func(item, index+1)}

mais c'est sûrement pas ce que vous voulez.

2) La prochaine chose que vous pouvez faire est de définir un indice j dans le bloc et l'utiliser à la place de l'index d'origine:

some_array.each_with_index{|item, i| j = i + 1; some_func(item, j)}

3) Si vous voulez utiliser les index de cette façon, souvent, ensuite, de définir une autre méthode:

module Enumerable
  def each_with_index_from_one *args, &pr
    each_with_index(*args){|obj, i| pr.call(obj, i+1)}
  end
end

%w(one two three).each_with_index_from_one{|w, i| puts "#{i}. #{w}"}
# =>
1. one
2. two
3. three


Mise à jour

Cette réponse, qui a été répondu il y a quelques années, est désormais obsolète. Pour les modernes, Rubis, Zack Xu réponse fonctionnera mieux.

4voto

Je suis tombé dessus.

Ma solution non nécessaire est la meilleure, mais elle a juste fonctionné pour moi.

Dans la vue itération:

il suffit d'ajouter: index + 1

C’est tout pour moi, étant donné que je n’utilise aucune référence à ces numéros d’index, mais uniquement à l’affichage dans une liste.

4voto

Andrew Grimm Points 22996

Si some_index est significatif, envisagez d'utiliser un hachage plutôt qu'un tableau.

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