我在某处读到每个对象的实例变量都是唯一的。
我不知道如何理解那句话。有人可以解释吗?
我的猜测是,这意味着同一个类的两个实例有它们自己的、非共享的实例变量,即使它们被称为同一个东西。
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"
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
实例变量彼此没有任何关系,如果它们指向相同的值,那么这仅仅是巧合。
因此,每个对象实例变量都是唯一的想法并不意味着它们不能引用相同的东西,而是意味着它们彼此不同,无论它们引用什么。