2011-05-12 3 views
40

내가 arr = [1, 2, 3, 4]을 가지고 있다면 나는 다음과 같이 할 수 있음을 안다 ...루비 배열 each_slice_with_index?

> arr.each_slice(2) { |a, b| puts "#{a}, #{b}" } 
1, 2 
3, 4 

... 그리고 ...

> arr.each_with_index { |x, i| puts "#{i} - #{x}" } 
0 - 1 
1 - 2 
2 - 3 
3 - 4 

...하지만 거기에 이렇게 할 수있는 방법이 있는가?

> arr.each_slice_with_index(2) { |i, a, b| puts "#{i} - #{a}, #{b}" } 
0 - 1, 2 
2 - 3, 4 

나는 내 자신을 만들 수 있으며 배열 방법에 집어 넣을 수 있음을 알고 있습니다. 이 작업을 수행 할 수있는 함수가 있는지 살펴보기 만하면됩니다.

답변

79

대부분의 반복기 메소드와 마찬가지로 each_slice은 루비 1.8.7+ 이후 블록없이 호출 될 때 열거 형을 반환합니다.이 열거 형 메서드를 호출하면 더 많은 열거 가능 메소드를 호출 할 수 있습니다. 그래서 당신은 할 수있다 :

arr.each_slice(2).with_index { |(a, b), i| puts "#{i} - #{a}, #{b}" } 
+3

아주 멋진 ARR * 할 수 있습니다! 원래의 문제를 완료하기 위해 원래의 arr에서 인덱스를 얻으려면 # {i * 2}를 수행해야하며 슬라이스 된 열거 형의 인덱스는 가져 오지 않아야합니다. – Drew

6

1.9에서 블록을 제공하지 않으면 많은 메소드가 열거자를 반환한다. 열거 자에서 다른 메서드를 호출 할 수 있습니다.

arr = [1, 2, 3, 4, 5, 6, 7, 8] 
arr.each_with_index.each_slice(2){|(a,i), (b,j)| puts "#{i} - #{a}, #{b}"} 

(@ sepp2k의 변형). 결과 :

0 - 1, 2 
2 - 3, 4 
4 - 5, 6 
6 - 7, 8 
10
arr.each_slice(2).with_index { |(*a), i| ... 

또한 배열, 블록의 첫 번째 매개 변수가

관련 문제