2012-06-02 2 views
3

배열의 일부를 반복하고 싶습니다. 예를 들어, 내가 첫 번째 제외한 모든 요소를 ​​인쇄하려고 :ruby ​​- 배열을 천천히 반복합니다.

array[1..-1].each {|e| puts e} 

그러나 array[1..-1] 새로운 Array을 구축합니다. array이 매우 큰 경우 낭비입니다. 또 다른 간단한 접근 방식 :

(1...array.size).each { |i| puts array[i] } 

작동합니다. 그러나 좀 더 우아한 트릭이 있는지 궁금합니다. (! 환상적인 뉴스) 지금 우리가 enumerable-lazy 같은 보석을 사용하여 엔진을 따뜻하게 수에 대한

답변

5

루비 2.0, Lazy enumerables을 제공합니다 :

require 'enumerable/lazy' 
xs.lazy.drop(1).each { |x| puts x } 

을 나쁘지 않아,하지만 개념적으로 정확히 적용되지 않습니다 이미 요소를 버리기 위해 트래버스해야하는 게으른 개체 (링크 된 목록)가 아니기 때문에 배열에 이미 있기 때문에 (ok, 우리는 하나의 요소를 여기에서 버리는 것이고, deal-breaker는 아닐 것입니다). 따라서 많은 것을 사용할 계획이라면 (범위를 사용하는) 솔루션을 Enumerable#each_from(start_index)으로 추상화하면됩니다.

더 : 당신은 또한 Enumerable#lazy 객체를 반환 열거-게으른Array#lazy_slice(range)의 확장을 만들 수 있습니다. 그것은 또한 꽤 좋아 보이는데 : xs.lazy_slice(1..-1).each { |x| puts x }

1
array.each_with_index {|x, i| puts x unless i.eql?0} 
+2

'puts x i.zero? heh :) – fl00r

+0

@ fl00r yeah :) 비교할 수있는 충분한 방법이 있습니다. – kiddorails

관련 문제