Ruby中的实例变量初始化

前端之家收集整理的这篇文章主要介绍了Ruby中的实例变量初始化前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想在尝试理解 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]

猜你在找的Ruby相关文章