0

我正在尝试创建一个 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 方法按描述工作?

谢谢

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 回答