如何在Ruby中干掉一个枚举器?

问题描述 投票:2回答:1

我班有一个 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个回答
5
投票

这正是 Object#enum_for 方法的作用。它创建了一个 Enumerator 迭代方法中的一个块。

只要在你写的任何迭代方法的第一行(在参数验证之后)加上这样的内容就可以了。

def each_line
  return enum_for(__callee__) unless block_given?

  while line = readline
    yield line
  end
end
© www.soinside.com 2019 - 2024. All rights reserved.