Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby中的实例变量_Ruby - Fatal编程技术网

Ruby中的实例变量

Ruby中的实例变量,ruby,Ruby,Ruby 1.9 我突然意识到我不明白如何在Ruby中定义和初始化实例变量。它必须仅在某个类中使用,并且在类外根本无法访问,因此attr\u访问器或attr\u阅读器不是我需要的 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

Ruby 1.9

我突然意识到我不明白如何在Ruby中定义和初始化实例变量。它必须仅在某个
类中使用,并且在类外根本无法访问,因此
attr\u访问器
attr\u阅读器
不是我需要的

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 initialize
     @my_var = 'some value'
  end

  # etc...
end

是的,
初始化
是正确的方法

但您也可以:

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

是的,
初始化
是正确的方法

但您也可以:

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

它们只能在方法(构造函数)
initialize()
中初始化?这是我的问题。它们可以在任何实例方法中初始化,但是
initialize
是任何给定实例调用的第一个方法,因此它是执行此操作的最佳位置。为什么不能在任何方法中初始化它<代码>类MyClass@my_var='some value';end
?无论何时创建实例变量,它都会与
self
的当前值相关联,在任何方法之外,如果将与
MyClass
类对象相关联,则在方法内部
self
指的是
MyClass
的当前实例。因此,如果在方法之外进行初始化,它将与类本身相关联,而不是与该类的特定实例相关联。它们只能在方法(构造函数)
initialize()
中进行初始化?这是我的问题。它们可以在任何实例方法中初始化,但是
initialize
是任何给定实例调用的第一个方法,因此它是执行此操作的最佳位置。为什么不能在任何方法中初始化它<代码>类MyClass@my_var='some value';end?无论何时创建实例变量,它都会与
self
的当前值相关联,在任何方法之外,如果将与
MyClass
类对象相关联,则在方法内部
self
指的是
MyClass
的当前实例。因此,如果在方法外部初始化,它将与类本身关联,而不是与该类的特定实例关联。这是惰性定义模式。这是惰性定义模式。