2013-10-09 39 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