0

红宝石 1.9

我突然意识到我不明白如何在 Ruby 中定义和初始化实例变量。它只能在某个特定的范围内使用class,并且根本无法从类中访问,因此attr_accessor或者attr_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

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

4

2 回答 2

3

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

class MyClass

  def initialize
     @my_var = 'some value'
  end

  # etc...
end
于 2012-08-02T14:18:24.847 回答
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
于 2012-08-02T14:25:52.803 回答