【问题标题】:How to dry up an Enumerator in Ruby如何在 Ruby 中干涸一个枚举器
【发布时间】:2020-05-17 17:49:44
【问题描述】:

我的班级有一个File,我想实现each_line,其功能与File#each_line 相同,因此可以使用块或不使用块来调用它。在没有块的情况下调用时,会返回一个Enumerator

这是我目前的代码:

  def each_line(&block)
    if block_given?
      read_loop(&block)
    else
      Enumerator.new do |y|
        read_loop(&y)
      end
    end
  end

  private

  def read_loop(&block)
    while line = readline
      block.yield line
    end
  end

我想知道是否有一种更简洁的惯用方式来实现 each_line,而不是询问是否传递了一个块并做非常相同的事情,只是在每种情况下略有不同。

readline 是类中的公共方法(它的作用与File#readline 的作用更多。

【问题讨论】:

    标签: ruby enumerator


    【解决方案1】:

    这正是Object#enum_for 方法的用途。它从一个接受块的迭代方法中创建一个Enumerator

    只需将这样的内容作为您编写的任何迭代方法的第一行(在参数验证之后):

    def each_line
      return enum_for(__callee__) unless block_given?
    
      while line = readline
        yield line
      end
    end
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-17
    • 2018-02-23
    • 1970-01-01
    • 2010-09-11
    • 1970-01-01
    • 2010-11-28
    • 2012-11-01
    相关资源
    最近更新 更多