Quelle est la façon la plus simple de convertir
[x1, x2, x3, ... , xN]
à
[[x1, 2], [x2, 3], [x3, 4], ... , [xN, N+1]]
Si vous utilisez ruby 1.8.7 ou 1.9, vous pouvez utiliser le fait que les méthodes d'itérateur comme each_with_index
, lorsqu'elles sont appelées sans bloc, retournent un Enumerator
objet, que vous pouvez appeler des Enumerable
méthodes comme map
on. Vous pouvez donc faire:
arr.each_with_index.map { |x,i| [x, i+2] }
Dans 1.8.6, vous pouvez faire:
require 'enumerator'
arr.enum_for(:each_with_index).map { |x,i| [x, i+2] }
.each_with_index.map
?map
est une méthodeEnumerable
comme toujours.each_with_index
, Lorsqu'il est appelé sans bloc, retourne unEnumerator
objet (en 1.8.7+), qui se mélange dansEnumerable
, de sorte que vous pouvez appelermap
,select
,reject
etc. sur elle comme sur un tableau, hachage, etc. gammearr.map.with_index{ |o,i| [o,i+2] }
map.with_index
ne fonctionne pas en 1.8.7 (map
retourne un tableau lorsqu'il est appelé sans bloc en 1.8).Ruby a Enumerator # with_index (offset = 0) , donc convertissez d'abord le tableau en énumérateur en utilisant Object # to_enum ou Array # map :
la source
foo = ['d'] * 5; foo.map!.with_index { |x,i| x * i }; foo #=> ["", "d", "dd", "ddd", "dddd"]
Dans ruby 1.9.3, il existe une méthode chaînable appelée
with_index
qui peut être chaînée pour mapper.Par exemple:
la source
Sur l'obscurcissement supérieur:
la source
Voici deux autres options pour 1.8.6 (ou 1.9) sans utiliser l'énumérateur:
la source
J'ai toujours apprécié la syntaxe de ce style:
L'invocation
each_with_index
vous donne un énumérateur que vous pouvez facilement cartographier avec votre index disponible.la source
Une façon amusante mais inutile de le faire:
la source
A fun, but useless way
.+2
est de créer la sortie demandée par l'OPla source
la source
map.with_index
existe déjà en rubis. Pourquoi suggérer de rouvrir la classe énumérable et d'ajouter quelque chose qui existe déjà?each_with_index.map
etc. et même ceux d'entre nous sur les versions plus récentes pourraient préférer avoir à utiliser map.with_index FWIW :)Je fais souvent ceci:
Au lieu d'itérer directement sur les éléments du tableau, vous parcourez une plage d'entiers et vous les utilisez comme indices pour récupérer les éléments du tableau.
la source