この質問の再帰的な性質についてはお詫びしますが、SOに関する質問に対して選択された回答により、反射の理解に疑問が生じました。
リフレクションは主に、プログラムの実行中に内部で起こっていることを照会することだと思っていました。このレスポンスに示されている例は、Ruby の組み込み Integer クラスにパッチを当てています。
- これは、実行時の変更というよりも、関数のオーバーロード/継承に似ていませんか?
- クラスの再開は本当に反省の例ですか?
この質問の再帰的な性質についてはお詫びしますが、SOに関する質問に対して選択された回答により、反射の理解に疑問が生じました。
リフレクションは主に、プログラムの実行中に内部で起こっていることを照会することだと思っていました。このレスポンスに示されている例は、Ruby の組み込み Integer クラスにパッチを当てています。
リフレクションを使用して遅延バインディングを実装できます。
遅延バインディングを使用して、モンキー パッチを実装できます。
モンキー パッチを使用して、その回答に示されているようなコーディング スタイルを実現できます。
しかし、モンキー パッチやリフレクションを必要としない機能を実装する方法は他にもあります。一体、優れたマクロ プリコンパイラがあれば、それに近づくことができます。
したがって、技術的には正しいですが、(IMHO)最大の例ではありません。
再帰のレベルが上がるリスクを冒して、そのリンクで私の答えを参照しているにもかかわらず、私は返答したいと思います。
内向きを参照することとして反射を直感的に理解しているため、誤解は簡単にわかります。そして、それは確かにプログラミングにおけるリフレクションの重要な側面です。たとえば、Rubyには、実行時にオブジェクトが自分自身について質問できるようにするinstance_ofのようなメソッドがあります。
しかし、リフレクションのウィキペディアの定義を見てください:
リフレクションは、コンピュータプログラムがそれ自体の構造と動作を観察および変更できるプロセスです。
ご覧のとおり、リフレクションは単なる実行時の自己検査以上のものです。また、実行時の動作を変更する機能でもあります。クラスを再開することは、「モンキーパッチ」とも呼ばれます。あなたはここでそれについてもっと読むことができます。
モンキーパッチは、 元のソースコードを変更せずに、動的言語のランタイムコードを拡張または変更する方法です。
このプロセスは、次のようにも呼ばれます。-ゲリラパッチ-以前に宣言されたクラスの拡張-クラスの再開-ダイナミックファンク-ハイジャック-ダックパンチ-メソッドスウィズリング