为什么我不能在初始化中使用attr_accessor?
我正在尝试在initialize
执行一个instance_eval
后跟一个attr_accessor
,我不断得到这个:“initialize’:undefined method’attr_accessor’`。 为什么这不起作用?
代码看起来像这样:
class MyClass def initialize(*args) instance_eval "attr_accessor :#{sym}" end end
您不能在实例上调用attr_accessor,因为attr_accessor未定义为MyClass的实例方法。 它仅适用于模块和类。 我怀疑你想在实例的元类上调用attr_accessor,如下所示:
class MyClass def initialize(varname) class <
更清晰的实现( 注意:这将为该类的所有实例添加访问器,而不仅仅是单个实例,请参阅下面的注释 ):
class MyClass def initialize(varname) self.class.send(:attr_accessor, varname) end end
Rob d’Apice 几乎是对的。 你只需要写:
self.singleton_class.send(:attr_accessor, varname)
要么
self.singleton_class.class_eval "attr_accessor :#{varname}"
或者我最喜欢的变种
self.singleton_class.class_exec do attr_accessor varname end
假设varname
的值是一个符号