2013-10-09 44 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。每個(或收集,地圖等),我必須自己實現它。我已經花了大約兩個小時在互聯網上,我還沒有得到如何去做,因爲在每個例子中,他們只是委派「每個」功能已經完成類如Array ... 或者他們只是不在乎返回「枚舉器「沒有給出任何阻止​​。


SOLUTION:

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

這是工作,tx :)。 – libik