为什么我不能在初始化中使用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的值是一个符号