こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

書籍 メタプログラミングRubyの中の一文

上記書籍のP143の
カレントクラスについて質問です。

上記書籍に、
【クラス定義のなかでは、カレントオブジェクトselfは定義されたクラスである】
という記述がありますが

例えば、以下のようなクラス定義あがあるとします。

class Test

print self.class
def self.method_01()
print "メソッド01"
end

def method_02()
return self
end
end

クラス定義内に3箇所selfが存在しますが、
インスタンスメソッド の method_02()内のselfはnewメソッドによって
作成されたTestクラスのインスタンスの意味だと思います。
それより上の二つのselfは確かに定義中のカレントオブジェクト・・つまりTestクラス
ですけれど、なぜ書籍では、クラス定義内でのselfという表現なのでしょうか?

個人的には、【クラス定義内で定義されるインスタンスメソッド内にあるselfを除くselfはカレントオブジェクトである】という風に、説明すべきだと思うのですが

何か私の解釈に誤りがあるのでしょうか?それとも、文面を気にしすぎなだけでしょうか?
くだらない質問ですがご意見をおきかせください。

投稿日時 - 2011-10-06 00:27:32

QNo.7054193

困ってます

質問者が選んだベストアンサー

解釈としては間違ってないです。
「クラス定義の中で~」の文章を、「メソッド定義の中で~」が上書きする形で、別の意味を与えていると思えば良いと思います。

「クラス定義のコンテキストの中で」の略記と考えた方が良いか。

投稿日時 - 2011-10-06 06:49:14

ANo.2

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

>クラス定義内で定義されるインスタンスメソッド内にあるselfを除くselfはカレントオブジェクトである
selfは常にカレントオブジェクトですよ。
ひとつめ、ふたつめのselfは「クラス定義の中」なのでselfは定義されたクラス(クラス名)を返す。
みっつめは「メソッド定義の中」なのでselfはレシーバを返す。
「メタプログラミングRuby」は持っていませんが、そのすぐ後のページにメソッド定義の中のselfの話があるのでは?

投稿日時 - 2011-10-06 01:02:40

お礼

ああ・・なるほど、定義したクラスからnewしたインスタンスで実行するインスタンスメソッド内のselfは、これも実行中のインスタンスメソッドからすれば同じくカレントオブジェクトということですか・・・。
なるほど・・・・。

投稿日時 - 2011-10-06 22:27:12

あなたにオススメの質問