具有属性的动态 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 又名语法糖,用于为 name
和 name=
方法定义普通访问器。它可能没有任何约束。要定义约束,应该使用明确的 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
希望对您有所帮助。
我正在尝试使用
生成动态classdynamic_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 又名语法糖,用于为 name
和 name=
方法定义普通访问器。它可能没有任何约束。要定义约束,应该使用明确的 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
希望对您有所帮助。