2012-05-30 4 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을 읽을 수는 있지만 내가 뭔가 유용한 ... 당신은 Array에 포함되어 대신 Enumerable,보고 할 수 있습니다

+1

+1 설명서를 읽으려고합니다. –

답변

19

를 찾지 못했습니다.

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

수익률 :

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

당신이 원하는 방법은 반복적으로 열거에서 주어진 요소 (또는 끝에 많은이없는 경우 이하)의 수를 산출 Enumerable#each_slice입니다

+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 *없이 block-youll 'Enumerator' 인스턴스를 얻습니다. 그러면이 인스턴스를 추가로 처리 할 수 ​​있습니다. – Ashe

+0

'[ 'sda', 'sdb', 'sdc', 'sdd']와 유사합니다. each_slice (2) .to_a' – steenslag