발굴이 여기에 멋진 Enumerator
(게으른 순서)는 포함되어 있습니까 : 우리는 순서의 전면을 잡아 수있는 방법에이유를 열거 (가장 큰이 <code>Float</code> 루비 나타낼 수) 1 ~ Enumerable에서
1.9.3-p327 :014 > e = (1..Float::INFINITY).each
봐 :
1.9.3-p327 :015 > e.first
=> 1
1.9.3-p327 :016 > e.take(2)
=> [1, 2]
그게 좋은 물건입니까? 나도 그렇게 생각해. 하지만 다음 :
1.9.3-p327 :017 > e.drop(2).first
랄라 랜드로 이동합니다. 그리고 그것이 5 초 이내에 돌아 오지 않는다는 것을 의미합니다.
1.9.3-p327 :020 > p e.method(:drop)
#<Method: Enumerator(Enumerable)#drop>
열거 (e
)가 Enumerable
(모듈)로부터 #drop
방법을 가지고 있음을 표시 Enumerator
(클래스)에 혼합 : 여기
오 단서입니다. 이제 세계에서 루비가 가서 Enumerable
을 Enumerator
에 넣으면 어떨까요? 나도 몰라. 그러나 그곳에는 Enumerator
in Ruby 1.9.3과 Enumerator
in Ruby 2.0에 문서화되어 있습니다.
내가보기에 문제는 Enumerable
에 정의 된 일부 메소드가 Enumerator
에서 작동한다는 것입니다. 예 : #first
및 #take
입니다. 다른 하나 이상 : #drop
이 작동하지 않습니다.
Enumerable
을 포함한 Enumerator
은 버그입니다. 어떻게 생각해? 항상 게으른로 Enumerable
방법의 무리를 정의 루비 2.0 Enumerator::Lazy
(Enumerator
의 서브 클래스)를 정의
PS 사항. 뭔가 생선 냄새가납니다. 비유 축계와 경우에 따라서는 (Enumerator
)의 하위 클래스 ()에서 지연 옵션을 제공하기 위해 혼합해야하는 이유는 무엇입니까? 첫 번째 부분에 대응
1.9.3-p327 :018 > p e.method(:first)
#<Method: Enumerator(Enumerable)#first>
1.9.3-p327 :020 > p e.method(:drop)
#<Method: Enumerator(Enumerable)#drop>
'e = (1.Float :: INFINITY) .each'의'each'는 아무런 차이가 없습니다. 정확히 무엇을 원 하느냐에 따라, 그것을 버려두거나'게으른'로 대체해야합니다. –
Marc-André에 감사드립니다. 그러나 Ruby 1.9.3에는 Enumerable # lazy가 없습니다. 2.0에서만 사용 가능합니다. 내 주요 오해 중 하나는 #drop이 열거자를 전혀 반환하지 않는다고 가정하는 것입니다. 웬일인지 #drop과 #take는 사소한 열거 자 구현이 가능하지만 둘 다 열거자를 반환하지는 않습니다! [Ruby Bug # 7715 "게으른 열거 자들이 게으른 체재하고 싶다"] (https://bugs.ruby-lang.org/issues/7715)에 대한 수정조차도이를 수정하지 못합니다. 생각 해보니, 배열을 반환하는 사람들에게 의존하는 코드를 깨면 "고정"될 수 없습니다! –
사실,'drop'은 "열심히"입니다. BTW,'require 'backports/2.0.0/enumerable/lazy''with와 함께 Ruby의 모든 버전에서'lazy'로 게임 할 수 있습니다. –