如何在 Ruby 中耗尽枚举器
How to dry up an Enumerator in Ruby
我的 class 中有一个 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
是 class 中的一个 public 方法(它比 File#readline
做的更多。
这正是采用块的迭代方法中的 Object#enum_for
method is for. It creates an Enumerator
。
只需将类似这样的内容作为您编写的任何迭代方法的第一行(在参数验证之后):
def each_line
return enum_for(__callee__) unless block_given?
while line = readline
yield line
end
end
我的 class 中有一个 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
是 class 中的一个 public 方法(它比 File#readline
做的更多。
这正是采用块的迭代方法中的 Object#enum_for
method is for. It creates an Enumerator
。
只需将类似这样的内容作为您编写的任何迭代方法的第一行(在参数验证之后):
def each_line
return enum_for(__callee__) unless block_given?
while line = readline
yield line
end
end