各オブジェクトのインスタンス変数が一意であることをどこかで読みました。
その発言をどう解釈していいのかわからない。誰か説明できますか?
私の推測では、同じクラスの 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"
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"
。2 つの@name
インスタンス変数が同じ値を指している場合、これは単なる偶然ではなく、互いに何の関係もありません。
したがって、各オブジェクトのインスタンス変数が一意であるという考えは、それらが同じものを参照できないという意味ではなく、それらが参照するものに関係なく、互いに異なることを意味します。