1

私はこの機能を持っています:

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|ました。

どういうわけか、これを行う方法が私に来ていません。

4

2 に答える 2

1

でプライベートfile_parserメソッドを作成しSpecialParserます。

次に、クラスの残りの部分を次のように設定します。

class SpecialParser
  include Enumerable  # needed to provide the other Enumerable methods

  def initialize(filename)
    @filename = filename
    @enum = file_parser(filename)
  end

  def each
    @enum.each do |val|
      yield val
    end
  end
end

編集:

他の Enumerable メソッドを無料で使用したい場合include Enumerableは、クラス内でも行う必要があります。

于 2013-09-12T19:15:18.910 に答える