我的班级中有一个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
我想知道是否有一种更简洁的惯用方式来实现eaching_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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句