※ ChatGPTを利用し、要約された質問です(原文:Ruby 特異メソッドのnewが先に実行?)
Ruby 特異メソッドのnewが先に実行?
2011/08/20 10:58
このQ&Aのポイント
Rubyのインスタンス生成について質問があります。
Hoge = Class.new() の場合、Hogeクラスには特異メソッドのみを定義でき、通常のインスタンスメソッドは定義できません。
hoge = Class.new() の場合は、クラスオブジェクトではなくただのインスタンスとなります。
Rubyのインスタンス生成について質問があります。
通常クラスを定義する場合は
class Hoge ;
def hello();
pirnt "hello";
end
であると思います。
ただ
Hoge = Class.new();
でもクラスは定義できるとききました。
ただこの場合Hogeクラスに定義できるのは HogeというClassクラスから作られた特異クラスとしてのHogeに
特異メソッドのみを定義できるということですよね?
通常のインスタンスメソッドは定義できませんよね?
ではでは、 hoge = Class.new();
とした場合はどうなるのでしょうか?
この場合は Classクラスの純粋なインスタンスとなるのでしょうか?
前者の定義とおなじ仕方ですが代入先が、通常の変数です。
この場合は、クラスオブジェクトとして生成されるのですか?
オンラインマニュアルをみたところ
「新しく名前の付いていない superclass のサブクラスを生成します。 superclass が省略された時にはObject のサブクラスを生成します。
名前のないクラスは、最初に名前を求める際に代入されている定数名を検索し、見つかった定数名をクラス名とします。」
とあります。
上記内容は Classクラスの特異クラスとして定義されている特異メソッド(new)です。
これは Class.new()で作られたインスタンスを代入する先が定数であればその定数名と同じクラスを定義しつつそのClassクラスのクラスオブジェクトを生成するという意味合いでまちがいないでしょうか?
上記のとおりであれば
hoge =Class.new()の場合は、やはりhogeというクラスを定義することになるのでしょうか?
クラス定義は定数でなければならないはずですよね。
ただ実際、 p hoge;として出力すると#とひょうじされています。これはhogeがクラスオブジェクトではなく
ただのインスタンスであるということでしょうか?
であるならばこの hoge = Class.new()の式のnewはClassクラスオブジェクトに定義された特異メソッドではなく
Classクラスに定義されたnewメソッド・・・・・つまりClassクラスに定義されたインスタンスメソッドの方のnewメソッドだとおもうのですが・・・・・・。
つまりこちらのメソッドですね。
「new( ... )
クラスのインスタンスを生成して返します。このメソッドの引数はブロック引数も含め initialize に渡されます。」
※オンラインリファレンスから参照しました。
しかし
通常メソッドの検索は特異メソッドからはじまりその後クラスのインスタンスメソッド->親クラスのメソッドと
検索して行くとあります。
必ず先に、特異メソッドを実行しているはずだと思うのですが・・・。
やはり特異メソッドnewを実行しているのでしょうか?
長々すみませんが、ご教授ください。
質問の原文を閉じる
質問の原文を表示する
補足
ありがとうございます。 順を追って行くとよく理解できました。 hoge = Class.new();(1) Hoge = hoge;(2) class Hoge;(3) def hello(); print "やあ"; end end 上記のように、Class.new(1)でつくったhogeを正規?のクラスオブジェクトとするために Hogeっていう定数に参照を代入。(2) ※ここでようやくHogeがクラスオブジェクトになるっていう感じでしょうか。? 実際にHogeっていうクラスオブジェクトがClassクラスのnewというインスタンスメソッド でレシーバのオブジェクトを作るためにレシーバのHogeというクラスオブジェクトと同名のHogeクラスの定義を見つけてきてそのインスタンスを作ると・・・・。 こんな理解でいいのでしょうか。 少なくとも class Hoge;(3) def hello(); print "やあ"; end end は、純粋にクラスを定義しているだけであり、クラスオブジェクトではないってこと、・・・ですよね? クラスオブジェクトであるHogeは自分と同じ名前を持つクラス定義をコード内から探してきているみたいな。 もしHogeっていう定数に無名クラスを代入して、HogeというクラスをつくっていなかったとしてもObjectクラスのインスタンスメソッドのみを継承してくるようですね。 Hogeっていうクラスオブジェクトが作られた時点で定数と同名のクラスHogeは自動的に 定義されちゃうかんじか・・ふむふむ とにもかくにもこれで先へ進めそうです。 Rubyのシルバー認定試験にはなんとしても受かりたいのでしっかり見に付けておきます。