在自己的每个方法中返回枚举器

时间:2013-10-09 16:37:06

标签: ruby

我有这个方法的类,它应该返回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

1 个答案:

答案 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?