我在某处读到每个对象的实例变量都是唯一的。
我不确定如何理解这种说法。有人可以解释一下吗?
答案 0 :(得分: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"
答案 1 :(得分:0)
与像JavaScript这样的语言中的变量不同,ruby中的变量不是全局范围的。例如,如果你在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,也有一个不同的变量,也称为my_variable,它存在于myMethod方法的范围内。因此,在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
实例变量彼此没有任何关系,如果它们指向相同的值,那么这只是巧合。
因此,每个对象实例变量都是唯一的并不意味着它们不能引用相同的东西,这意味着它们彼此不同,无论他们引用了什么。