1

我有这个方法的类,如果没有给出块,它应该返回 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(或收集、映射等),我必须自己实现。我在互联网上花了大约两个小时,但我仍然不知道该怎么做,因为在每个示例中,他们只是将“每个”函数委托给已经完成的类,如 Array ......或者他们只是不关心返回“枚举器”因为没有给出块。


解决方案 :

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

1 回答 1

2

您的第一个问题是您没有从您的方法中明确返回任何内容。在传递一个块的情况下,约定each是 return self,也是Array如此。

在没有给出块的情况下,创建块的标准方法Enumerator是使用Kernel#to_enum方法。因此,例如,您可以使用以下内容作为方法的第一行,正如您的类未定义 #each 时返回 Enumerator::Lazy 的最佳方法是什么?

return to_enum(:each) unless block_given?
于 2013-10-09T17:18:27.410 回答