2

私は (楽しみと利益のために) Ruby でオブジェクトを検査し、そのソース コードを発見する機能を追加しようとしています。生成されたバイトコードではなく、内部表現の逆コンパイルされたバージョンではなく、そのオブジェクトを作成するために解析された実際のソースです。

私は Rubinius について学ぶのがかなり遅かったので、まだ完全には理解できていませんが、いくらか進歩したと思います。

しかし、私はこれを行う方法を理解するのに苦労しています。私の最初のアプローチは、単に別のインスタンス属性を AST 構造 (たとえば、ClosedScope オブジェクト用) に追加することでした。次に、実行時にバイトコードが解釈されるときに、どういうわけかその属性を再度引き出します。

これは健全なアプローチのように思えますか?

4

3 に答える 3

5

サミュエル氏が言うように、 pry と do を使うだけですshow-source foo。しかし、内部でどのように機能するかを知りたいと思うかもしれません。

Ruby には便利な機能が 2 つあります。まず、オブジェクトのすべてのメソッドのリストを取得できます。電話するだけfoo.methodsです。次に、各メソッドに file_name および line_number 属性を提供します。

オブジェクトのソース コード全体を見つけるには、すべてのメソッドをスキャンし、定義されている場所でグループ化します。次に、ルビストがメソッドを定義するために使用する方法またはその他のいくつかの方法がclass表示されるまで、ファイルをスキャンします。module次に、クラス/モジュール定義全体を特定するまで、各ファイルを順方向にスキャンします。

dgitized が指摘しているように、人々がコア オブジェクトにモンキー パッチを適用した場合、そのような定義が複数作成されることがよくあります。デフォルトでは、pry はほとんどのメソッドを含むモジュール定義のみを表示します。で他のものをリクエストできますshow-source -a

于 2012-11-18T06:21:57.217 に答える
2

Pryを調べましたか?それはあなたが求めたことを正確に実行できると主張するRubyインタプリタ/デバッガです。

于 2012-11-18T04:37:36.353 に答える
-1

set_trace_func を試しましたか? これは rubinius 固有のものではありませんが、要求どおりに動作し、pry やその他の gem に基づいていません。

http://www.ruby-doc.org/core-1.9.3/Kernel.html#method-i-set_trace_funcを参照

于 2012-11-18T07:26:55.750 に答える