我正在尝试使用
生成动态类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]/
答案 0 :(得分:1)
attr_accessor :name
只是用于定义name
和name=
方法的普通访问器的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
希望它有所帮助。