使用属性生成动态类

时间:2015-04-25 12:44:57

标签: ruby metaprogramming

我正在尝试使用

生成动态类
dynamic_name = 'Person'
Object.const_set(dynamic_name, Class.new {def init(attrs); end}) 

我想为这个类生成属性。我试着这样做:

Person.class.module_eval { attr_accessor :name}

但是可以将它直接放入init方法吗?我还需要为属性设置约束,例如上面的属性名称应为size > 0,并且允许包含正则表达式的字符/^[A-Z]/

1 个答案:

答案 0 :(得分:1)

attr_accessor :name只是用于定义namename=方法的普通访问器的DSL aka语法糖。它可能没有任何限制。要定义约束,应该使用显式的setter定义:

attr_reader :name
def name= neu
  raise ArgumentError.new("Name must be not empty") if neu.empty?
  # additional constraints
  @name = neu
end

与上述问题无关的不同之处是:

  

是否可以将其直接放入init方法?

虽然我仍然没有得到所有这些木头舞的东西,但有可能:

def init *args
  # native init stuff
  self.class.define_method :name do
    @name
  end unless self.class.method_defined? :name
  self.class.define_method :name= do |neu|
    raise ArgumentError.new("Name must be not empty") if neu.empty?
    # additional constraints
    @name = neu
  end unless self.class.method_defined? :name=
end

希望它有所帮助。