475 votes

Comment faire une carte avec un index en Ruby ?

Quel est le moyen le plus simple de convertir

[x1, x2, x3, ... , xN]

à

[[x1, 2], [x2, 3], [x3, 4], ... , [xN, N+1]]

889voto

sepp2k Points 157757

Si vous utilisez ruby 1.8.7 ou 1.9, vous pouvez utiliser le fait que les méthodes d'itérateurs comme each_with_index lorsqu'ils sont appelés sans bloc, renvoient un Enumerator que vous pouvez appeler Enumerable des méthodes comme map sur. Donc tu peux le faire :

arr.each_with_index.map { |x,i| [x, i+2] }

Dans la version 1.8.6, vous pouvez le faire :

require 'enumerator'
arr.enum_for(:each_with_index).map { |x,i| [x, i+2] }

0 votes

Merci ! Pourriez-vous me donner un pointeur vers la documentation pour .each_with_index.map ?

0 votes

Dans ce cas map est une fonction de quoi ?

2 votes

@Misha : map est une méthode de Enumerable comme toujours. each_with_index lorsqu'il est appelé sans bloc, renvoie un Enumerator (dans la version 1.8.7+), qui intègre l'objet Enumerable Vous pouvez donc appeler map , select , reject etc., tout comme sur un tableau, un hachage, une plage, etc.

283voto

tokland Points 29813

Ruby a Enumerator#with_index(offset = 0) Il faut donc d'abord convertir le tableau en un énumérateur en utilisant la méthode suivante Objet#to_enum o Tableau#map :

[:a, :b, :c].map.with_index(2).to_a
#=> [[:a, 2], [:b, 3], [:c, 4]]

14 votes

Je pense que c'est la meilleure réponse, car elle fonctionnera avec Map ! foo = ['d'] * 5; foo.map!.with_index { |x,i| x * i }; foo #=> ["", "d", "dd", "ddd", "dddd"]

162voto

fruqi Points 153

Dans ruby 1.9.3, il existe une méthode chaînable appelée with_index qui peut être enchaîné à map.

Par exemple :

array.map.with_index { |item, index| ... }

19voto

Andrew Grimm Points 22996

Obfuscation à outrance :

arr = ('a'..'g').to_a
indexes = arr.each_index.map(&2.method(:+))
arr.zip(indexes)

17 votes

Andrew doit avoir une grande sécurité d'emploi ! :)

9voto

Phrogz Points 112337

Voici deux autres options pour 1.8.6 (ou 1.9) sans utiliser l'énumérateur :

# Fun with functional
arr = ('a'..'g').to_a
arr.zip( (2..(arr.length+2)).to_a )
#=> [["a", 2], ["b", 3], ["c", 4], ["d", 5], ["e", 6], ["f", 7], ["g", 8]]

# The simplest
n = 1
arr.map{ |c| [c, n+=1 ] }
#=> [["a", 2], ["b", 3], ["c", 4], ["d", 5], ["e", 6], ["f", 7], ["g", 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