書籍「メタプログラミングRuby」に記載されている、クラスインスタンス変数の説明文が、どうにも腹落ちしなくて
ASCII「メタプログラミングRuby」を読んでいて疑問に思った部分がある。 同著のP.144からP.145にかけて、「4.1.4 クラスインスタンス変数」の説明があって 以下はそこからの引用。
class MyClass @my_var = 1 def self.read; @my_var; end def write; @my_var = 2; end def read; @my_var; end end obj = MyClass.new obj.write obj.read #=> 2 MyClass.read #=> 1 上記のコードでは、2つのインスタンス変数を定義している。どちらも同じ@my_var という名前だ。しかし、それぞれ異なるスコープで定義されており、別々のオブジェク トに属している。動作を確認するには、クラスは単なるオブジェクトであること、それ から、プログラムを読むときはselfを追いかけることを思い出す必要がある。1つ目 の@my_varは、objがselfとなる場所に定義されている。つまり、これはobjオブジェ クトのインスタンス変数だ。2つ目の@my_varは、MyClassがselfとなる場所に定義 されている。つまり、これはMyClassオブジェクトのインスタンス変数だ。こちらは クラスインスタンス変数と呼ばれる。
疑問に思ったのは、上記の説明文4行目の終わりから始まる、以下の部分
1つ目の@my_varは、objがselfとなる場所に定義されている。 つまり、これは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オブジェクトのインスタンス変数」なのでしょうか?
もし、そうで あるならば、私が何について理解が足りないか ご教示いただけると幸いです。
追記
テラテイルという、わりと最近できたQAサイトに質問を投げたら、回答して頂けた。 ありがとうございました。