我班有一个 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
的功能。
这正是 Object#enum_for
方法的作用。它创建了一个 Enumerator
迭代方法中的一个块。
只要在你写的任何迭代方法的第一行(在参数验证之后)加上这样的内容就可以了。
def each_line
return enum_for(__callee__) unless block_given?
while line = readline
yield line
end
end