ASCII「メタプログラミングRuby」を読んでいて、疑問に思った部分があるので、それについて教えて下さい。
同著のP.144からP.145にかけて、「4.1.4 クラスインスタンス変数」の説明があります。
以下はそこからの引用です。
lang
1 2class MyClass 3 @my_var = 1 4 5 def self.read; @my_var; end 6 def write; @my_var = 2; end 7 def read; @my_var; end 8end 9 10obj = MyClass.new 11obj.write 12obj.read #=> 2 13MyClass.read #=> 1 14 15 上記のコードでは、2つのインスタンス変数を定義している。どちらも同じ@my_var 16という名前だ。しかし、それぞれ異なるスコープで定義されており、別々のオブジェク 17トに属している。動作を確認するには、クラスは単なるオブジェクトであること、それ 18から、プログラムを読むときはselfを追いかけることを思い出す必要がある。1つ目 19の@my_varは、objがselfとなる場所に定義されている。つまり、これはobjオブジェ 20クトのインスタンス変数だ。2つ目の@my_varは、MyClassがselfとなる場所に定義 21されている。つまり、これはMyClassオブジェクトのインスタンス変数だ。こちらは 22クラスインスタンス変数と呼ばれる。 23
疑問に思ったのは、上記の説明文4行目の終わりから始まる、以下の部分です。
lang
11つ目の@my_varは、objがselfとなる場所に定義されている。 2つまり、これはobjオブジェクトのインスタンス変数だ。
この説明で、「1つ目の@my_var」とは、class MyClass
の次の行の
@my_var = 1
のことを指しているものと思いますが、私の考えだと、これはobj
で参照
されるオブジェクトのインスタンス変数 ではなく、クラスインスタンス変数
であって、説明文中、「2つ目の@my_var」として記されている、
def self.read; @my_var; end
によって、MyClass定義の外側から、その値を読めるようにしているのでは
ないでしょうか?
それとも、説明文のとおり、class MyClass
の次の行の
@my_var = 1
は、「objオブジェクトのインスタンス変数」なのでしょうか?もし、そうで
あるならば、私が何について理解が足りないかご教示いただけると
幸いです。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2014/08/30 14:23
2014/08/30 14:37