Qual é a maneira mais fácil de converter
[x1, x2, x3, ... , xN]
para
[[x1, 2], [x2, 3], [x3, 4], ... , [xN, N+1]]
Se você estiver usando ruby 1.8.7 ou 1.9, poderá usar métodos iteradores como each_with_index
, quando chamados sem bloco, retornam um Enumerator
objeto, ao qual você pode chamar Enumerable
métodos como map
. Então você pode fazer:
arr.each_with_index.map { |x,i| [x, i+2] }
No 1.8.6, você pode fazer:
require 'enumerator'
arr.enum_for(:each_with_index).map { |x,i| [x, i+2] }
.each_with_index.map
?map
é um método deEnumerable
como sempre.each_with_index
, Quando chamado sem um bloco, retorna umEnumerator
objeto (1.8.7+), que mistura emEnumerable
, então você pode chamarmap
,select
,reject
etc. nele como em uma matriz, mistura, variam etc.arr.map.with_index{ |o,i| [o,i+2] }
map.with_index
não funciona no 1.8.7 (map
retorna uma matriz quando chamada sem um bloco no 1.8).O Ruby possui o Enumerator # with_index (offset = 0) ; portanto, primeiro converta a matriz em um enumerador usando Object # to_enum ou Array # map :
fonte
foo = ['d'] * 5; foo.map!.with_index { |x,i| x * i }; foo #=> ["", "d", "dd", "ddd", "dddd"]
No ruby 1.9.3, existe um método
with_index
encadeado chamado que pode ser encadeado para mapear.Por exemplo:
fonte
Over ofuscação superior:
fonte
Aqui estão mais duas opções para 1.8.6 (ou 1.9) sem usar o enumerador:
fonte
Eu sempre gostei da sintaxe deste estilo:
A chamada
each_with_index
fornece um enumerador que você pode mapear facilmente com o seu índice disponível.fonte
Uma maneira divertida, mas inútil, de fazer isso:
fonte
A fun, but useless way
.+2
é criar a saída solicitada pelo OP #fonte
fonte
map.with_index
já existe em rubi. Por que sugerir reabrir a classe enumerável e adicionar algo que já existe?each_with_index.map
etc. map.with_index FWIW :)Costumo fazer isso:
Em vez de iterar diretamente sobre os elementos da matriz, você está iterando em um intervalo de números inteiros e usando-os como índices para recuperar os elementos da matriz.
fonte