- ベストアンサー
Ruby言語のクラス定義に関する質問
- Ruby言語におけるクラス定義について質問です。Class.new()を使用してデフォルト引数を持つクラスを生成する場合、公式のリファレンスによれば、無名クラスが生成されます。この無名クラスはメタクラスと同義でしょうか?また、メタクラスはClassクラスのインスタンスであると言えるのでしょうか?
- Class.new()メソッドを使用してデフォルト引数のあるクラスを生成する場合、Rubyでは無名クラスが生成されます。無名クラスはYUGUIさんのサイトの画像にあるメタクラスと同様のものでしょうか?また、メタクラスはClassクラスのインスタンスということになるのでしょうか?
- Ruby言語でClass.new()を使用してデフォルト引数を持つクラスを生成する場合、無名クラスが生成されます。無名クラスはメタクラスと同じ意味合いを持つのでしょうか?また、メタクラスはClassクラスのインスタンスであると言えるのでしょうか?
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
>(無名クラス と メタクラスは同義??) 無名クラスとメタクラスは直接は関係ありません。Yuguさんは、Classクラスオブジェクトの特異クラスのことをメタクラスと呼んでいるようですね。特異クラスは一般に無名クラスですが。 >また上記URLの画像からメタクラスはClassクラスのインスタンスであるようです。 特異クラスであろうが、メタクラスであろうが、すべてのクラスはClassクラスのインスタンスです。 理由は無いというか、それがRubyのクラスの概念です。数学で言う公理みたいなものか。 >もう一点、p Cattle.class();と記述するとClassクラスが返ると思います。 Classという定数が返りますが、これはClassクラスのことですね。 >これはCattleクラスのClassクラスのインスタンスであるということになるのでしょうか? 日本語がおかしいです。 Cattleという定数に代入されているのは、Classクラスのインスタンス(のリファレンス)であると言うことです。わかりやすく言うと、CattleというのはClassクラスのインスタンスということ。 >しかしながらYUGUIさんの画像ではCattleはメタクラスのインスタンスとなっています。 であれば、メタクラスを意味するのでしょうか? 図のしたの↓は読みましたか?理解できましたか? Yugui>つまり、初期状態ではメタメタクラスというものは定義されていないんだな。メタクラスに対して特異メソッドを定義しようとしたとき、初めてメタメタクラスみたいなものが作成されて、 一般に、クラスAのインスタンスXに特異メソッドを定義すると、「Xの特異クラス」が作られて、XはAのインスタンスで無く、Aのサブクラスである「Xの特異クラス」のインスタンスに変わります。これは特異メソッドや特異クラスの説明の所に書いてあるはず。 で、classメソッドで返る値では特異クラスのことは隠されます。うーん、このこと、Object#classのリファレンスに書いてないですね。 上の文のA←Class、X←Cattle とするとあの図の関係になりますね。「メタクラス=Classクラスインスタンス(ここれはCattle)の特異クラス」なので、Xの特異クラスのことをメタクラスと呼んでいるわけです。 基本的な理解のためには、「メタクラス」という言葉を頭の中から一度追い払って、「クラス」「特異クラス」だけで考えるといいと思いますよ。 特異クラスというものを十分理解してから、「メタクラス=クラスの特異クラス」と覚えるといいかと。
お礼
ありがとうございます。 とりあえず、ひととおりCGI的な処理が作れればいいので まずは、ざくっと使えるようになるまでは深く突っ込まないようにします。