Rubyでのメタクラス
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/12/06 12:23 UTC 版)
「メタクラス」の記事における「Rubyでのメタクラス」の解説
Rubyでは、クラス自体がClassというクラスのインスタンスであり、Class.newという形でクラスを動的に生成することもできる。ClassはModuleを継承しており、動的なメソッドの操作といったクラスに共通な機能があるほか、特異メソッド(あるオブジェクトだけに有効なメソッド)を使うことで、Smalltalk-76のような単一のメタクラスでクラスごとの多様性をもたせることができる。具体的には、存在しないメソッドの呼び出しや、継承・メソッドの追加といったタイミングで呼び出されるフック関数を特異メソッドとして実装することができる。 RubyのMOPは、継承やインスタンス化のループ関係がない平易なものであり、BasicObject発のトップダウンの継承ツリー構造になっている。だが、特異クラスの方はやや複雑になる。(右図参照)Rubyの特異クラス(eigenclassとも)は、Smalltalkのimplicitクラス(Foo classとか)を置き換えたものである。 まず、ユーザー定義クラスのメタクラスであるClassまでの継承関係を下に示す。 BasicObject - 大元Kernel - 全共通デフォルトメソッドを定義している。Objectにインクルードされる Object - 全てのクラスのスーパークラス Module - モジュールのクラス。ユーザー定義モジュールを定義できる Class - クラスのクラス。ユーザー定義クラスを定義できる RubyではクラスAをランタイム改装(メソッド追加など)すると、その特異クラスの方が改装されてそれがクラスAに反映されるようになっている。クラスAを定義するとClass←Aの特異←Aのメタクラス関係ができるが、ここでAのサブクラスBを定義すると、Class←Bの特異←Bのメタクラス関係もできて、Aの特異←Bの特異の継承関係もできる。
※この「Rubyでのメタクラス」の解説は、「メタクラス」の解説の一部です。
「Rubyでのメタクラス」を含む「メタクラス」の記事については、「メタクラス」の概要を参照ください。
- Rubyでのメタクラスのページへのリンク