具有属性的动态 class 生成

Dynamic class generation with attributes

我正在尝试使用

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

我想为此 class 生成属性。我试着这样做:

Person.class.module_eval { attr_accessor :name}

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

的字符

attr_accessor :name 只不过是 DSL 又名语法糖,用于为 namename= 方法定义普通访问器。它可能没有任何约束。要定义约束,应该使用明确的 setter 定义:

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

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

is it possible to put this directly into the init method?

虽然我还是不明白这些木杜舞是为了什么,但有可能:

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

希望对您有所帮助。