我想在尝试理解
Ruby中的实例变量时我会有点疯狂.我唯一的目标是确保为给定类创建的每个对象都有一个具有预定值的变量,而无需为该类编写初始化方法.就像是:
class Test @my = [] attr_accessor :my end t = Test.new t.my # I want [] but this shows nil
是否可以在不触及初始化的情况下实现此目的?谢谢.
编辑:为了澄清,我正在编写一些代码,这些代码将被执行类似于attr_accessor,因为它会将实例变量添加到执行它的类中.如果我自己编写初始化文件,我最终会破坏用户编写的文件.
解决方法
你正在做的是在类级别定义一个实例变量(因为类是Class类的实例,这样可以正常工作).
不,没有办法初始化.
编辑:您在编辑中有一点误解. attr_accessor不会向类添加实例变量.从字面上看,它的作用是什么(使用我的例子):
def my; @my; end def my=(value); @my = value; end
它不主动创建/初始化任何实例变量,它只定义了两个方法.你可以使用define_method编写自己的类方法来完成类似的事情.
编辑2:
为了进一步说明如何编写这样的方法:
class Module def array_attr_accessor(name) define_method(name) do if instance_variable_defined?("@#{name}") instance_variable_get("@#{name}") else instance_variable_set("@#{name}",[]) end end define_method("#{name}=") do |val| instance_variable_set("@#{name}",val) end end end class Test array_attr_accessor :my end t = Test.new t.my # => [] t.my = [1,2,3] t.my # => [1,3]