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