1

私はRubyのメタプログラミングを発見しました(Rubyを7年間使用した後、もうすぐです!)。次の質問があります。

および他のメタポーグラミング関数を使用してクラスにメソッドを追加するプログラムを実行すると仮定するとclass_eval、同じプログラムを再実行するときに、これらの新しいメソッドをすでに定義する簡単な方法がありますか、それとも自分のシステムをプログラムする必要がありますか? 、使用するたびclass_evalに、次にプログラムを実行するときに再評価するために、生成されたコードをファイルに保存しますか?

ありがとう

4

2 に答える 2

3

これはそれが行われる方法ではありません。適切な方法は、次回プログラムを実行するときに、へのすべての呼び出しdefine_methodclass_evalおよびそれ以外)を再度実行し、実行時にメソッドを定義することです。

生成されたメソッドがソースコードに残っているとどうなるか想像してみてください。attr_accessor自分自身を2つの新しい方法に置き換えますか?

そのようなメタメソッドを自分で作成していて、それを変更した場合はどうなりますか。保存された生成されたメソッドはすべてどのように更新されると思いますか?

メタプログラミングについてどこで読んだかわかりませんが、この本を強くお勧めします:メタプログラミングRuby。それはあなたの頭をクリアする必要があります。:)

于 2012-09-03T10:12:51.730 に答える
2

あなたはできません(evalと自己組織化された文字列では可能ですが、それはもはやメタプログラミングではありません)、そしてそれをすべきではありません、rubyの標準ライブラリでさえプログラムの起動時に再評価されます。

別の可能性はフォークです、ユニコーンはその良い例です。すべてのメソッド定義を評価してから、「マスター」プロセスのコピーである子プロセスの生成を開始します。これにより、フォークはそれに比べてかなり高速であるため、すべてのコードを再評価する時間を節約できます。

于 2012-09-03T10:13:13.463 に答える