2012-05-30 2 views
10

У меня есть следующий массив:рубин петли массива всегда пара

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

Теперь я хочу, чтобы цикл через эти записи, но всегда с двумя элементами. Я делаю это как следующий в данный момент:

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

Это чувствует себя как-то не так, есть лучший способ сделать это? Есть ли способ легко добраться до чего-то вроде [['sda', 'sdb'], ['sdc', 'sdd']]?

Я прочитал http://www.ruby-doc.org/core-1.9.3/Array.html, но я не нашел что-то полезное ...

+1

+1 для чтения документации. –

ответ

19

Вы можете захотеть взглянуть на Enumerable вместо, который входит в Array.

метод вы хотите Enumerable#each_slice, который неоднократно дает от перечислимы количество элементов данных (или меньше, если не так много в конце):

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

Урожайность:

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

Хорошо, нет комментариев ... Я проверил [Enumerator] (http://www.ruby-doc.org/core-1.9.3/Enumerator.html) ... –

+0

Да, они очень похожи; обратите внимание, что 'Enumerator' фактически * включает *' Enumerable'; вы можете думать о «Enumerator» как об общем интерфейсе, чтобы перечислять вещи; если вы вызываете '[1, 2, 3] .each' или' ['sda', 'sdb', 'sdc', 'sdd']. each_slice (2) '-both * без * блока-вы получите экземпляр «Enumerator», который вы затем можете продолжить. – Ashe

+0

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

Смежные вопросы