質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.19%

書籍「メタプログラミングRuby」に記載されている、クラスインスタンス変数の説明文についての質問です。

解決済

回答 2

投稿 ・編集

  • 評価
  • クリップ 1
  • VIEW 1,063

jun68ykt

score 8894

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オブジェクトのインスタンス変数」なのでしょうか?もし、そうで
あるならば、私が何について理解が足りないかご教示いただけると
幸いです。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

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  の方でしょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2014/08/30 23:23

    原文のご提示、ありがとうございます。なるほど、分かりました。
    もともとの原文自体が、
    「@my_var = 2 はインスタンス変数であり、@my_var = 1は、クラスインスタンス変数である」
    というふうに、コード例のココと明示的に分かるようには、書いてなかったのですね。

    この本は、ビルというベテランプログラマーが読者である「あなた」に、いろいろお題を出してコーチするという体裁なので、
    「ひとつはインスタンス変数で、もうひとつは、クラスインスタンス変数(なんだけど分かるかい?)」
    というようなニュアンスの訳にしておいてくれたら、よかったのかもしれませんね。

    キャンセル

  • 2014/08/30 23:37

    追記:

    原文を読んでから、あらためて邦訳のほうを読むと、邦訳に出てくる

    「1つ目の@my_var」

    をコード例の最初に出てくる、

    @my_var = 1

    のことであると思い込んでしまったのが、単に、私の早合点だった
    かもしれないと思い始めています。

    キャンセル

+1

「1つ目の@my_var」とは、
obj.read             #=> 2 
のことで、
「2つ目の@my_var」とは、
MyClass.read         #=> 1 
のことを指していると思われます。

そうでないと意味が通りません。
原文を見てみたいですね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2014/08/30 22:43

    回答ありがとうございます。そうですね、原文を確認したいです。
    おっしゃるように、今のところとりあえずは、<原文では、「1つ目の@my_var」とは、
    obj.read #=> 2
    のことで、 「2つ目の@my_var」とは、
    MyClass.read #=> 1
    のことを指している意味の英語になっているんだろうな>と思うことで、いちおう納得して、先に進むことにします。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.19%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • Rubyに関する質問
  • 書籍「メタプログラミングRuby」に記載されている、クラスインスタンス変数の説明文についての質問です。