繁体   English   中英

Ruby中的实例变量

[英]Instance variables in Ruby

Ruby 1.9

我突然意识到我不了解如何在Ruby中定义和初始化实例变量。 只能在特定的class而根本不能从某个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

好吧,第二种方法正确吗?

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

class MyClass

  def initialize
     @my_var = 'some value'
  end

  # etc...
end

是的, 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM