我有这个方法的类,它应该返回Enumerator,如果没有给出块,或者如果给出则枚举。它只是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 Enumerator”
要使用@ data.each(或收集,映射等)是FORBIDDEN,我必须自己实现它。我在互联网上花了大约两个小时,我仍然没有得到如何做到这一点,因为在每个例子中,他们只是将“每个”功能委托给已完成的类,如Array ... 或者他们只是不关心返回“Enumerator”没有给出阻止。
解决方案:
def each
if (block_given?)
0.upto(size - 1) do |x|
yield @data[x]
end
self
else
to_enum(:each)
end
end
答案 0 :(得分: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?