1

我在某处读到每个对象的实例变量都是唯一的。

我不知道如何理解那句话。有人可以解释吗?

4

2 回答 2

4

我的猜测是,这意味着同一个类的两个实例有它们自己的、非共享的实例变量,即使它们被称为同一个东西。

class Dog
  def initialize(name)
    @name = name
  end
end

dog1 = Dog.new('Spot')
dog2 = Dot.new('Rover')

dog1.instance_variable_get "@name" # "Spot"
dog2.instance_variable_get "@name" # "Rover"
于 2012-05-19T07:59:45.523 回答
0

ruby 中的变量与 JavaScript 等语言中的变量不同,它不是全局范围的。例如,如果您在 irb 中执行此操作:

1.9.3-p125 :036 > def myMethod
1.9.3-p125 :037?>   my_variable = 12
1.9.3-p125 :038?>   end
 => nil 
1.9.3-p125 :039 > myMethod
 => 12 
1.9.3-p125 :040 > my_variable
NameError: undefined local variable or method `my_variable' for main:Object
    from (irb):40
    from /Users/Thoughtworks/.rvm/rubies/ruby-1.9.3-p125/bin/irb:16:in `<main>'

变量 my_variable 不存在于方法之外,因为它不再在范围内。我也可以这样做:

1.9.3-p125 :057 > my_variable = 13
 => 13 
1.9.3-p125 :058 > myMethod
 => 12 
1.9.3-p125 :059 > my_variable
 => 13 

在这种情况下,即使我在主作用域中命名了 my_variable,但在方法 myMethod 的作用域中存在一个不同的变量,也称为 my_variable。所以在myMethod作用域内给my_variable赋值12不会改变主作用域内的变量,方法作用域内也不存在主变量。

对于一堂课,如果我这样写:

class Dog
  attr_accessor :name
  def initialize(name)
    @name = name
  end
end

spot = Dog.new(:spot)
fido = Dog.new(:spot)

然后两者都spot.name指向fido.name同一个东西——符号:spot。但如果我这样做:

spot.name = "spot"

那么fido.name仍然是:spot,并且spot.name将会是"spot"。这两个@name实例变量彼此没有任何关系,如果它们指向相同的值,那么这仅仅是巧合。

因此,每个对象实例变量都是唯一的想法并不意味着它们不能引用相同的东西,而是意味着它们彼此不同,无论它们引用什么。

于 2012-05-19T19:21:49.980 回答