每个对象的实例变量在Ruby中是唯一的吗?

时间:2012-05-19 07:43:28

标签: ruby

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

我不确定如何理解这种说法。有人可以解释一下吗?

2 个答案:

答案 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.namefido.name都指向相同的内容 - 符号:spot。但如果我这样做:

spot.name = "spot"

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

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