0

私は次のことを可能にするミックスインモジュール、パーサーを作成しようとしています:

class MyParser

 include Parser

 field :my_field, 1, 10
 field :my_other_field, 11, 15

end 

m = MyParser.new("1234567890abcde")

m.my_field # - > "1234567890"
m.my_other_field  # ->  "abcde"

Rubyでのメタプログラミングは初めてです

ここに私の質問がありますか?Parser を含むクラスごとに @fields 配列を作成する必要があります。

@fields 配列に新しいフィールドを追加できるフィールド クラス メソッドが必要ですが、class_method からインスタンス変数にアクセスするにはどうすればよいですか?

MyParser.new メソッドを説明どおりに動作させるにはどうすればよいですか?

ありがとう

4

1 に答える 1

1

ここにあります。コードの理解に問題がある場合は、私に知らせてください。明確にするよう努めます。

module Parser
  def self.included(base)
    base.extend ClassMethods
  end

  def initialize(str)
    self.class.fields.each do |name, opts|
      instance_variable_set(:"@#{name}", str[opts[:start]..opts[:stop]])
    end
  end

  module ClassMethods
    def field(name, start, stop)
      @fields ||= {}
      @fields[name.to_sym] = {:start => start-1, :stop => stop-1}
      class_eval { attr_reader name }
    end

    def fields
      @fields
    end
  end
end
于 2012-09-24T15:27:01.960 に答える