14
p = Proc.new{ puts 'ok' }

procでrubyコードを見ることができますか?

inspectメモリの場所を返します。

puts p.inspect
#<Proc:0x007f9e42980b88@(irb):2>

Ruby 1.9.3

4

5 に答える 5

9

sourcify gemを見てみましょう:

proc { x + y }.to_source
# >> "proc { (x + y) }"
于 2013-02-22T12:53:47.647 に答える
7

元のソースコードまたはそのバイトコード表現を意味しますか?

前者の場合、標準の Proc の方法を使用できます。source_location

p.source_location
=> ["test.rb", 21]

適切なコード行を読みます。

後者の場合、RubyVM::InstructionSequence とそのクラス メソッドの逆アセンブルが便利な場合があります。

irb> RubyVM::InstructionSequence.disasm p
=> "== disasm: <RubyVM::InstructionSequence:block in irb_binding@(irb)>
=====\n== catch table\n| catch type: redo   st: 0000 ed: 0011 sp: 0000
cont: 0000\n| catch type: next   st: 0000 ed: 0011 sp: 0000 cont:
0011\n|------------------------------------------------------------------------\n
0000 trace            1                                               
(   1)\n0002 putself          \n0003 putstring        \"ok\"\n0005 
send             :puts, 1, nil, 8, <ic:0>\n0011 leave            \n"
于 2013-02-22T13:07:00.517 に答える
5

いいえ、Ruby でそれを行う方法はありません。

一部の Ruby 実装には、ソース コードを取得するための実装固有の方法がある場合とない場合があります。

を使用Proc#source_locationしてProcが定義されているファイルを検索し、そのファイルを解析してソース コードを検索することもできます。ただし、 がProcファイルで定義されていない場合 (たとえば、 で動的に定義されているeval場合)、またはソース ファイルが存在しない場合 (たとえば、プログラムの AOT コンパイル バージョンを実行している場合) は機能しません。

したがって、短い答えは次のとおりです。いいえ、方法はありません。長い答えは次のとおりです。これを確実に機能させるには、あまりにも多くの要因に応じて、機能する場合と機能しない場合がある方法がいくつかあります。

ネイティブ コードで定義されているため、Ruby ソース コードさえないProcs は考慮されていません。

于 2013-02-22T13:29:48.873 に答える