2010-04-23 10 views

risposta

271

Date un'occhiata a Enumerable#each_slice:

foo.each_slice(3).to_a 
#=> [["1", "2", "3"], ["4", "5", "6"], ["7", "8", "9"], ["10"]] 
+2

Questo è perfetto. Grazie! –

+1

Così semplice, così rubino. Ho usato 't = []; d.each_slice (3) {| s | t << s} ', ... perché non ho appena provato #to_a, grazie amico. – Dorian

+0

Bello. Ho usato qualcosa di simile a 'foo.each_slice (3) .each_with_index {| f, i | inserisce "# {f}, # {i}"} 'per lavorare attraverso l'array a fette (o" blocchi "). – user664833

31

Se stai usando le rotaie è anche possibile utilizzare in_groups_of:

foo.in_groups_of(3) 
+10

nota che in_groups_of usa each_slice ed esegue anche "padding" se non hai bisogno del padding, quindi vai con each_slice – Urkle

+7

In realtà, puoi passare un secondo parametro a in_groups_of, indicandogli cosa con cui eseguire il pad, e se questo è falso, non si attacca. Quindi, non c'è bisogno di each_slice in entrambi i casi. – FrontierPsycho

+3

Fai attenzione. Rende l'elemento vuoto per 'nil'. Ad esempio, se si esegue 'arr = [0,1,2,3,4]' con 'in_gruppi_di (3)', il risultato è '[[0,1,2], [3,4, nil] ] '. In alcuni casi, può causare alcuni problemi. – Penguin

Problemi correlati