我有这个功能:

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模块包含到类中,并定义一个调用eachyield函数。
您仍然可以免费获得所有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/

10-12 13:09