【问题标题】:Returning Enumerator in own each method在自己的每个方法中返回枚举器
【发布时间】:2013-10-17 03:38:16
【问题描述】:

我有这个方法的类,如果没有给出块,它应该返回 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

【问题讨论】:

    标签: ruby


    【解决方案1】:

    您的第一个问题是您没有从您的方法中明确返回任何内容。在传递一个块的情况下,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?
    

    【讨论】:

      猜你喜欢
      • 2017-08-31
      • 2013-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多