2012-05-30 7 views
10

Tengo la siguiente matriz:rubí bucle gama siempre emparejar

a = ['sda', 'sdb', 'sdc', 'sdd'] 

Ahora quiero colocar a través de estas entradas, pero siempre con dos elementos. Lo hago como el siguiente en la actualidad

while b = a.shift(2) 
    # b is now ['sda', 'sdb'] or ['sdc', 'sdd'] 
end 

Esto se siente de alguna manera equivocada, hay una mejor manera de hacer esto? ¿Hay alguna manera de llegar fácilmente a algo como [['sda', 'sdb'], ['sdc', 'sdd']]?

leí http://www.ruby-doc.org/core-1.9.3/Array.html pero no he encontrado algo útil ...

+1

+1 por intentar leer la documentación. –

Respuesta

19

Es posible que desee ver en Enumerable lugar, que se incluye en Array.

El método que desea es Enumerable#each_slice, que produce repetidamente desde el enumerables el número de elementos dados (o menos si no hay que muchos al final):

a = ['sda', 'sdb', 'sdc', 'sdd'] 
a.each_slice(2) do |b| 
    p b 
end 

Rendimiento:

$ ruby slices.rb 
["sda", "sdb"] 
["sdc", "sdd"] 
$ 
+0

Muy bien, sin comentarios ... He comprobado [Enumerator] (http://www.ruby-doc.org/core-1.9.3/Enumerator.html) ... –

+0

Sí, son bastante similares; tenga en cuenta que 'Enumerator' en realidad * también incluye *' Enumerable'; se podría pensar en 'Enumerator' como una interfaz genérica para enumerar cosas; si llama '[1, 2, 3] .each' o' ['sda', 'sdb', 'sdc', 'sdd']. each_slice (2) '-both * sin * un bloque-usted obtener una instancia 'Enumerator', que luego puede hacer otras cosas. – Ashe

+0

Me gusta '['sda', 'sdb', 'sdc', 'sdd']. Each_slice (2) .to_a' – steenslag