3

Ruby でのメタプログラミングについて学び始めたばかりで、生成されたコードを (何らかの方法で) 表示できるかどうか疑問に思っていました。コーディングの練習として、いくつかのメソッド定義、または理想的にはクラスまたはモジュール定義全体を含む Ruby ファイルを生成する短いメソッドを書きたいと思います。

おそらく、ファイルの文字列表現を構築し、それを書き出すだけでそれを達成できるのではないかと考えていましたが、その方法ではメタプログラミングを使用する必要はありません。私の目標はメタプログラミングの演習であるため、それをそのプロセスに組み込むか、別の方法で行う方法を見つけたいと思います。

文字列構築のアプローチを取るとしたら、次のようなものから始めたいと思います

klass_string = "class GeneratedClass\n\t<BODY>\nend"

そして、どういうわけかこのようなものの出力を保存します

define_method( :initialize ) do
  instance_variable_set("@var", "some_value")
end

'' を置き換えることができる文字列でklass_string、ファイルに書き出されます。上記のコード スニペットを文字列に直接挿入するだけで問題なく動作することはわかっていますが、生成されずに手動で記述されたかのように、出力をより標準的な形式にしたいと考えています。

class GeneratedClass
  def initialize
    @var = 'some_value'
  end
end

誰かが私を正しい方向に向けることができますか?

4

1 に答える 1

2

この質問は実際にはメタプログラミングに関するものではなく、動的コードの生成/実行およびイントロスペクションに関するものであるというあなたのコメントに同意します。これらは興味深いトピックですが、実際にはメタプログラミングではありません。特に、ルビーコードを文字列に出力することに関するあなたの質問はイントロスペクションに関するものであり、文字列インジェクションの質問は動的コードに関するものです(興味のあることについてグーグルに言葉を与えるだけです)。

あなたの質問は一般的で、実際にはイントロスペクションと動的コードに関連しているため、詳細を学ぶのに役立ついくつかの標準的で有用なプロジェクトを紹介します..

ParseTree & Ruby パーサーSourcify

Ruby Parser は ParseTree の純粋な ruby​​ 実装であるため、そこから始めて、Ruby コードを調べて「文字列化」する方法を学ぶことをお勧めします。それらすべてを試してみてください。特に、Ruby でコードを調べて結果を生成する方法を学んでください。ボンネットの下で物事がどのように機能するかについて多くのことを学びます。とりわけ、Eric Hodel はこのことについて本当に賢いです..ただし、これは本当に高度な内容ですが、専門知識を構築したい場合は、これらの参照が役立つことを願っています!

于 2013-07-04T04:15:54.980 に答える