在元编程中访问实例var

时间:2012-09-24 14:54:31

标签: ruby metaprogramming

我正在尝试创建一个mixin模块Parser,它允许我执行以下操作:

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方法按照描述工作?

谢谢

1 个答案:

答案 0 :(得分: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