私の無知を許してください、しかしメタオブジェクトプロトコルとは何ですか、そしてRubyはそれを持っていますか?そうでない場合、Ruby用に実装することは可能ですか?Rubyが持つとしたら、メタオブジェクトプロトコルはどのような機能を備えているでしょうか?
2 に答える
メタオブジェクトプロトコルとは何ですか?
私が出くわした最も良い説明は、Class::MOP
ドキュメントからです:
メタオブジェクトプロトコルは、オブジェクトシステムへのAPIです。
具体的には、オブジェクトシステムのコンポーネント(クラス、オブジェクト、メソッド、オブジェクト属性など)を抽象化します。次に、これらの抽象化を使用して、それらが記述するオブジェクトシステムを検査および操作できます。
どのオブジェクトシステムにも2つのMOPがあると言えます。暗黙のMOPと明示的なMOP。暗黙的なMOPは、メソッドのディスパッチや継承などを処理します。これらは、オブジェクトシステムの動作の一部として自動的に発生します。明示的なMOPは通常、オブジェクトシステムのイントロスペクション/リフレクション機能を処理します。
すべてのオブジェクトシステムには暗黙のMOPがあります。1つがなければ、それらは機能しません。明示的なMOPはそれほど一般的ではなく、言語に応じて、制限的(JavaまたはC#でのReflection)からワイドオープン(CLOSが完璧な例)までさまざまです。
Rubyにはありますか?
組み込みクラスの再開に関するこのスレッドによると、組み込み関数を再定義しますか? Perlmonksの記事私は答えはノーだと思います(少なくともMOPが何であるかという最も厳密な意味で)。
明らかにここにはいくつかのしわくちゃの余地があるので、Class::MOP
/ Mooseの作者がそこで質問に答えるので、SOのPerl側に質問を投稿する価値があるかもしれません。
定義をよく見ると、RubyにはMOPがあることがわかります。CLOSのようなものですか?いいえ、CLOSは優れたメタサーキュラーMOPです(私は天才とさえ言えます)が、それは1つの本当の方法ではありません。Smalltalkを見てください。(基本的な)MOPを実装するために必要なのは、ランタイムが次のことを実行できるようにする関数を提供することだけです。
- 新しいクラスを作成または削除します
- 新しいプロパティまたはメソッドを作成します
- クラスに別のクラスから継承させる(「クラス構造の変更」)
- クラスのメソッドを定義するコードを生成または変更します。
そして、Rubyはそれをすべて行う方法を提供します。
ちなみに、Class :: MOPの作者は正しい(IMHO)と主張していますが、メタサーキュラーMOPでできることのいくつかはRubyでは難しいかもしれません(免責事項:私はゼロ、ジルチ、灘を持っていますPerlの知識なので、ここではMOPのようなSmalltalkとMOPのようなCLOSを考えています)が、それらのほとんどは非常に具体的であり(ここではメタクラスのインスタンス化について考えています)、それらなしで物事を機能させる方法があります。それはすべてあなたの視点に依存すると思います。メタサーキュラーMOPはよりクールですが、アカデミック側ではより実用的で実装が簡単です。