2013-10-09 6 views
1

이 메서드는 클래스가 있으므로 블록을 지정하지 않으면 열거 형을 반환하고 지정된 경우 열거합니다. 그것은 단지 Array.each 방법의 시뮬레이션입니다. 열거가 제대로 작동합니다.각 메서드에 고유 한 열거 자 반환

def each 
    if (block_given?) 
     0.upto(size - 1) do |x| 
     yield @data[x] 
     end 
    end 
    end 

그리고 위트이 코드를 테스트 :

it "should return Enumerator" do 
    res = subject.each 
    res.class.should eq Enumerator 
    res.to_a.should eq data 
end 

오류가있다 "장애/오류 : res.class.should는 EQ의 열거"

이 그것은 @data를 사용하는 것이 금지되어 있습니다. 각 (또는 수집,지도 등), 나는 그것을 직접 구현해야합니다. 나는 인터넷에서 약 2 시간을 보냈고 모든 예제에서 배열과 같은 이미 완료된 클래스에 "각"함수를 위임하기 때문에 여전히 수행 방법을 모르겠다. 아니면 그냥 "열거 자 "주어진 블록에 대해.


해결책 :

def each 
    if (block_given?) 
     0.upto(size - 1) do |x| 
     yield @data[x] 
     end 
     self 
    else 
     to_enum(:each) 
    end 
    end 

답변

2

첫 번째 문제는 당신이 명시 적 방법에서 아무것도 반환하지 않을 것입니다. 블록이 전달 된 경우 each의 규약은 self을 반환하며 Array과 같습니다.

블록을 지정하지 않은 경우 Enumerator을 만드는 표준 방법은 Kernel#to_enum 방법입니다. 따라서 예를 들어, What's the best way to return an Enumerator::Lazy when your class doesn't define #each?

return to_enum(:each) unless block_given? 
+0

에서 권장하는대로 다음을 첫 번째 줄로 사용할 수 있습니다. – libik