Ruby中的实例变量

时间:2012-08-02 14:15:53

标签: ruby

Ruby 1.9

我突然意识到我不了解如何在Ruby中定义和初始化实例变量。它必须仅在 某个class内使用,并且根本无法在类中访问,因此attr_accessorattr_reader不是我需要的。

class MyClass

  #how do I initialize it?
  @my_var = 'some value'

  def method1
    #I need to do something with @my_var
    puts @my_var
  end
  def method2
    #I need to do something with @my_var
    puts @my_var
  end
end

a = MyClass.new
a.method1 #empty 
a.method2 #empty

所以我发现还有另一种方法可以做到这一点

class MyClass

  #is this the only way to do it?
  def initialize
    @my_var = 555
  end

  def method1
    #I need to do something with @my_var
    puts @my_var
  end

  def method2
    #I need to do something with @my_var
    puts @my_var
  end
end

a = MyClass.new
a.method1 #555; it's ok
a.method2 #555; it's ok

那么,第二种方法是正确的吗?

2 个答案:

答案 0 :(得分:3)

每个类都有一个initialize()方法,其作用类似于其他语言的构造函数,实例变量应该在那里初始化:

class MyClass

  def initialize
     @my_var = 'some value'
  end

  # etc...
end

答案 1 :(得分:2)

是的,initialize是正确的方式。

但你也可以:

class MyClass

  def method1
    #I need to do something with @my_var
    puts @my_var ||= 555
  end

  def method2=(x)
    #I need to do something with @my_var
    puts @my_var = x
  end
end

#Test:
x = MyClass.new
x.method1      #555
x.method2= 44  #44
x.method1      #44

第一次调用method1时,它会初始化变量。

修改 当您指定nil

时,它无法按预期工作
x = MyClass.new
x.method1         #555
x.method2= nil   #nil
x.method1          #again 555

此版本效果更佳:

class MyClass

  def method1
    @my_var = 555 unless defined? @my_var
    puts @my_var 
  end

  def method2=(x)
    puts @my_var = x
  end
end

x = MyClass.new
x.method1         #555
x.method2= nil   #nil
x.method1          #keeps nil