43 votes

Tableau Ruby each_slice_with_index ?

Si j'ai arr = [1, 2, 3, 4] Je sais que je peux faire ce qui suit...

> arr.each_slice(2) { |a, b| puts "#{a}, #{b}" }
1, 2
3, 4

...Et...

> arr.each_with_index { |x, i| puts "#{i} - #{x}" }
0 - 1
1 - 2
2 - 3
3 - 4

...Mais existe-t-il un moyen intégré de le faire ?

> arr.each_slice_with_index(2) { |i, a, b| puts "#{i} - #{a}, #{b}" }
0 - 1, 2
2 - 3, 4

Je sais que je peux construire le mien et le coller dans la méthode array. Je cherche juste à savoir s'il existe une fonction intégrée pour faire cela.

87voto

sepp2k Points 157757

Comme la plupart des méthodes d'itération, each_slice retourne un énumérable lorsqu'il est appelé sans bloc depuis ruby 1.8.7+, sur lequel vous pouvez ensuite appeler d'autres méthodes énumérables. Vous pouvez donc le faire :

arr.each_slice(2).with_index { |(a, b), i| puts "#{i} - #{a}, #{b}" }

11voto

mekdigital Points 141
arr.each_slice(2).with_index { |(*a), i| ...

notez également que le tableau, premier paramètre du bloc, peut être *arr

6voto

steenslag Points 29662

Dans la version 1.9, beaucoup de méthodes retournent un énumérateur si aucun bloc n'est fourni. Vous pouvez appeler une autre méthode sur l'énumérateur.

arr = [1, 2, 3, 4, 5, 6, 7, 8] 
arr.each_with_index.each_slice(2){|(a,i), (b,j)| puts "#{i} - #{a}, #{b}"}

(Variation sur @sepp2k). Résultat :

0 - 1, 2
2 - 3, 4
4 - 5, 6
6 - 7, 8

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