2012-05-30 14 views
10

Ho il seguente array:rubino anello gamma accoppiare sempre

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

Ora voglio un ciclo tra queste voci, ma sempre con due elementi. Lo faccio come il seguente al momento:

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

Questo si sente in qualche modo sbagliato, c'è un modo migliore per fare questo? C'è un modo per ottenere facilmente qualcosa come [['sda', 'sdb'], ['sdc', 'sdd']]?

ho letto http://www.ruby-doc.org/core-1.9.3/Array.html ma non ho trovato qualcosa di utile ...

+1

+1 per aver tentato di leggere la documentazione. –

risposta

19

Si potrebbe desiderare di guardare Enumerable invece, che è incluso nel Array.

Il metodo che si desidera è Enumerable#each_slice, che produce più volte dal enumerabile il numero di elementi dati (o meno, se non ci sono che molti alla fine):

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

Resa:

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

Ok, nessun commento ... Ho controllato [Enumerator] (http://www.ruby-doc.org/core-1.9.3/Enumerator.html) ... –

+0

Sì, sono abbastanza simili; si noti che 'Enumerator' effettivamente * include *' Enumerable' pure; si potrebbe pensare a "Enumeratore" come un'interfaccia generica per fare enumerare le cose; se chiami '[1, 2, 3] .each' o' ['sda', 'sdb', 'sdc', 'sdd']. each_slice (2) '-both * senza * a block-you'll ottieni un'istanza di 'Enumerator', a cui puoi poi fare ulteriori cose. – Ashe

+0

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