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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

2回答

1450閲覧

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

jun68ykt

総合スコア9058

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

1クリップ

投稿2014/08/30 11:30

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

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

原文は以下のようです。

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 13:54

flied_onion

総合スコア2604

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jun68ykt

2014/08/30 14:23

原文のご提示、ありがとうございます。なるほど、分かりました。 もともとの原文自体が、 「@my_var = 2 はインスタンス変数であり、@my_var = 1は、クラスインスタンス変数である」 というふうに、コード例のココと明示的に分かるようには、書いてなかったのですね。 この本は、ビルというベテランプログラマーが読者である「あなた」に、いろいろお題を出してコーチするという体裁なので、 「ひとつはインスタンス変数で、もうひとつは、クラスインスタンス変数(なんだけど分かるかい?)」 というようなニュアンスの訳にしておいてくれたら、よかったのかもしれませんね。
jun68ykt

2014/08/30 14:37

追記: 原文を読んでから、あらためて邦訳のほうを読むと、邦訳に出てくる 「1つ目の@my_var」 をコード例の最初に出てくる、 @my_var = 1 のことであると思い込んでしまったのが、単に、私の早合点だった かもしれないと思い始めています。
guest

0

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

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

投稿2014/08/30 12:08

otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jun68ykt

2014/08/30 13:43

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問