1

各オブジェクトのインスタンス変数が一意であることをどこかで読みました。

その発言をどう解釈していいのかわからない。誰か説明できますか?

4

2 に答える 2

4

私の推測では、同じクラスの 2 つのインスタンスが、同じものと呼ばれていても、共有されていない独自のインスタンス変数を持っているということです。

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.namefido.name同じもの (シンボル ) を指します:spot。しかし、私がこれを行うと:

spot.name = "spot"

それからfido.nameまだあり:spot、そしてありspot.nameます"spot"。2 つの@nameインスタンス変数が同じ値を指している場合、これは単なる偶然ではなく、互いに何の関係もありません。

したがって、各オブジェクトのインスタンス変数が一意であるという考えは、それらが同じものを参照できないという意味ではなく、それらが参照するものに関係なく、互いに異なることを意味します。

于 2012-05-19T19:21:49.980 に答える