ruby - 如何在 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
。
解决方案
这正是该Object#enum_for
方法的用途。它Enumerator
从一个接受块的迭代方法中创建一个。
只需将这样的内容作为您编写的任何迭代方法的第一行(在参数验证之后):
def each_line
return enum_for(__callee__) unless block_given?
while line = readline
yield line
end
end
推荐阅读
- r - 对于每个主题多行的数据,将纵向值重塑为宽值
- c# - Facebook 密码更改,使用 C#
- java - JDBC 模板运行缓慢
- visual-studio - VS 2017 - NuGet Manager 不添加引用
- python - Numpy数组有头尾方法吗?
- node.js - 为什么 formData 不适用于多个文件?
- mysql - 组合多个表生成视图
- cmake - cmake find_program 命令找不到 lib.exe
- php - Laravel 命令工匠不作为 cron 工作
- javascript - Stripe / node.js:如何安全检索条带订阅 + 递增 1