p = Proc.new{ puts 'ok' }
procでrubyコードを見ることができますか?
inspect
メモリの場所を返します。
puts p.inspect
#<Proc:0x007f9e42980b88@(irb):2>
Ruby 1.9.3
sourcify gemを見てみましょう:
proc { x + y }.to_source
# >> "proc { (x + y) }"
元のソースコードまたはそのバイトコード表現を意味しますか?
前者の場合、標準の 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"
いいえ、Ruby でそれを行う方法はありません。
一部の Ruby 実装には、ソース コードを取得するための実装固有の方法がある場合とない場合があります。
を使用Proc#source_location
してProc
が定義されているファイルを検索し、そのファイルを解析してソース コードを検索することもできます。ただし、 がProc
ファイルで定義されていない場合 (たとえば、 で動的に定義されているeval
場合)、またはソース ファイルが存在しない場合 (たとえば、プログラムの AOT コンパイル バージョンを実行している場合) は機能しません。
したがって、短い答えは次のとおりです。いいえ、方法はありません。長い答えは次のとおりです。これを確実に機能させるには、あまりにも多くの要因に応じて、機能する場合と機能しない場合がある方法がいくつかあります。
ネイティブ コードで定義されているため、Ruby ソース コードさえないProc
s は考慮されていません。