gpt4 book ai didi

ruby - 如何创建枚举器包装类?

转载 作者:太空宇宙 更新时间:2023-11-03 18:20:47 27 4
gpt4 key购买 nike

我有这个功能:

def file_parser (filename)
Enumerator.new do |yielder|
File.open(filename, "r:ISO-8859-1") do |file|
csv = CSV.new(file, :col_sep => "\t", :headers => true, :quote_char => "\x07")
csv.each do |row|
yielder.yield map_fields(clean_data(row.to_hash))
end
end
end
end

我可以这样使用它:

parser = file_parser("data.tab")
parser.each do { |data| do_profitable_things_with data }

相反,我想将它放在自己的类中并像这样使用它:

parser = SpecialParser.new("data.tab")
parser.each do { |data| do_profitable_things_with data }

我已经尝试了一些我没想到的事情,比如从 initialize()self = file_parser() 中返回枚举器。

我也尝试过 super do |yielder|

出于某种原因,我没有想到这样做的方法。

最佳答案

您可以只将 Enumerable 模块包含到您的类中,并定义一个调用 yieldeach 函数。

您仍然可以免费获得所有 Enumerable 方法,例如 mapreduce 等。

class SpecialParser
include Enumerable

def initialize(n)
@n = n
end

def each
0.upto(@n) { |i| yield i }
end
end

sp = SpecialParser.new 4
sp.each { |i| p i }
p sp.map { |i| i }

输出:

0
1
2
3
4
[0, 1, 2, 3, 4]

关于ruby - 如何创建枚举器包装类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18772311/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com