2011-01-26 7 views
18

Procオブジェクトがあれば、その中のコードを見ることは可能でしょうか?例えばProcオブジェクトからコードを抽出するには?

:私は必要なもの

p = Proc.new{test = 0} 

は、既に作成されていたProcオブジェクトから文字列「= 0のテスト」を取得するためのいくつかの方法のためです。

+0

を使用することができます「PROC内のコードを検査します。」 –

+0

この質問が尋ねられてから数年が経ちました。このエリアに最近の開発があったかどうかは誰にでも分かりますか? – Ajedi32

+0

より最新の回答:http://stackoverflow.com/a/15024732/109175( "use sourcify") –

答えて

13

>> # tested with 1.8.7 
>> require "parse_tree" 
=> true 
>> require "ruby2ruby" 
=> true 
>> require "parse_tree_extensions" 
=> true 
>> p = Proc.new{test = 0} 
>> p.to_ruby 
=> "proc { test = 0 }" 

あなたはまた戻っルビーにPROCのこの文字列表現をオンにし、それを呼び出すことができます。

>> eval(p.to_ruby).call 
0 

この中ruby2rubyの詳細を動画:Hacking with ruby2ruby

+0

これはすばらしいビデオです。リンクに感謝します。 – zetetic

2

私はこれにParseTreeを使うことができると思います。また、Ruby 1.9.2のサポートはgetting closeと思われます。

+1

ParseTreeはRuby 1.8でEOLに達しました。 – weakish

10

proc.source_locationを使用して、procを定義するソースファイルの場所を取得します。 また、定義の行番号も返します。 これらの値を使用して、procソースの場所を特定することができます。

あなたが ruby2rubyライブラリを使用することができます
+0

これは文字通りこの質問に対する答えではありません。しかし、それは私がそれが思った場所からprocが来ていなかったこのような問題をデバッグするのに役立ちました。だから+1。 – AJFaraday

12

あなたはRuby 1.9のを使用している場合は、あなたがこれを言うための別の方法があり、ウェブ検索のthe sourcify gem

$ irb 
ruby-1.9.2-p0 > require 'sourcify' 
      => true 
ruby-1.9.2-p0 > p = Proc.new{test = 0} 
      => #<Proc:[email protected](irb):2> 
ruby-1.9.2-p0 > p.to_source 
      => "proc { test = 0 }" 
+3

sourcify宝石は今や維持されていません:https://github.com/ngty/sourcify/issues/34#issuecomment-75375440 – Gerry

関連する問題