書籍「メタプログラミングRuby」に記載されている、クラスインスタンス変数の説明文についての質問です。
解決済
回答 2
投稿 ・編集
- 評価
- クリップ 1
- VIEW 1,063
同著の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オブジェクトのインスタンス変数」なのでしょうか?もし、そうで
あるならば、私が何について理解が足りないかご教示いただけると
幸いです。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
One @my_var is defined with obj as self, so it’s an instance variable of the obj object. The other @my_var is defined with MyClass as self, so it’s an instance variable of the MyClass object—a Class Instance Variable.
「一つ目」「二つ目」だとではなく「一つは」「もう一方は」と訳して「with obj as self」などでいずれの@my_varかを推測させるべきだったんでしょうね。
もともとホワイトボードを前にした講義の書き起こしみたいですし元の文もちょっとわかりにくいですね。
Oneは
@my_var = 2;
もう一方 (The other)が @my_var = 1
だと思います。
つづく「クラスインスタンス変数はJavaのstatic変数に似ている」という文脈からもアクセスの仕方がそれに近い
MyClass.read #=> 1
の方でしょう。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
obj.read #=> 2
のことで、
「2つ目の@my_var」とは、
MyClass.read #=> 1
のことを指していると思われます。
そうでないと意味が通りません。
原文を見てみたいですね。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.19%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2014/08/30 23:23
もともとの原文自体が、
「@my_var = 2 はインスタンス変数であり、@my_var = 1は、クラスインスタンス変数である」
というふうに、コード例のココと明示的に分かるようには、書いてなかったのですね。
この本は、ビルというベテランプログラマーが読者である「あなた」に、いろいろお題を出してコーチするという体裁なので、
「ひとつはインスタンス変数で、もうひとつは、クラスインスタンス変数(なんだけど分かるかい?)」
というようなニュアンスの訳にしておいてくれたら、よかったのかもしれませんね。
2014/08/30 23:37
原文を読んでから、あらためて邦訳のほうを読むと、邦訳に出てくる
「1つ目の@my_var」
をコード例の最初に出てくる、
@my_var = 1
のことであると思い込んでしまったのが、単に、私の早合点だった
かもしれないと思い始めています。