首页 > 解决方案 > 如何在 Ruby 中干涸一个枚举器

问题描述

我的类中有一个File,我想实现each_line与它相同的功能,File#each_line以便可以使用块或不使用块来调用它。在没有块的情况下调用时,Enumerator返回 an。

这是我目前的代码:

  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

标签: rubyenumerator

解决方案


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

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

def each_line
  return enum_for(__callee__) unless block_given?

  while line = readline
    yield line
  end
end

推荐阅读