2009-11-04 9 views
11

私はブロックを取るメソッドを持っています。Rubyブロックのソースコードを印刷する

明らかに私は何が渡されるのかわからないし、私がここに行かないという奇妙な理由から、ブロックの内容を印刷したいと思います。

これを行う方法はありますか?

答えて

9

これは、to_rubyメソッドを実装するRuby2Rubyで実行できます。

require 'rubygems' 
require 'parse_tree' 
require 'parse_tree_extensions' 
require 'ruby2ruby' 

def meth &block 
    puts block.to_ruby 
end 

meth { some code } 

意志出力:

"proc { some(code) }" 

私はまた、彼はいくつかの興味深いruby2rubyおよび解析ツリーの使用例を示しGitHubのhttp://goruco2008.confreaks.com/03_wanstrath.htmlのクリスWanstrathことで、この素晴らしい話をチェックアウトします。

+0

これはRuby 1.8でのみ動作しますかhttp://blog.zenspider.com/2009/04/parsetree-eol .htmlはParseを処理するための "ブロック/ procサポートの削除"について語るRuby 1.9ではツリーが使用できません。 –

+0

これは、ParseTreeが動作するのに必要なフックを提供しないため、ルビ1.9では機能しません。どうやら、1.9でsexpを取得するnowayがあります。これは巨大な問題ではありません。なぜなら、誰もがルビニウスのような1.9の他のvmsをプライムタイムで利用できるようにする必要があるからです。 Rubiniusにはすべてのオブジェクトのto_sexpがネイティブに含まれているため、このような操作を行うのは簡単です。 –

3

Evangenieurの答え上の建物、ここにあなたがRuby 1.9のを持っていた場合Corbanの答えです:

# Works with Ruby 1.9 
require 'sourcify' 

def meth &block 
    # Note it's to_source, not to_ruby 
    puts block.to_source 
end 

meth { some code } 

私の会社は、炭素の計算を行うために使用Rubyコードを表示するために、これを使用しています...私たちは、パースツリーを使用しましたRuby 1.8、今はsourcify with Ruby 1.9です。 Rubyで

2

1.9+(2.1.2でテスト済み)、あなたはblock#source経由https://github.com/banister/method_source

印刷アウトソースを使用することができます。ソースが読み込まれるようにするために必要なことを

#! /usr/bin/ruby 
require 'rubygems' 
require 'method_source' 

def wait &block 
    puts "Running the following code: #{block.source}" 
    puts "Result: #{yield}" 
    puts "Done" 
end 

def run! 
    x = 6 
    wait { x == 5 } 
    wait { x == 6 } 
end 

run! 

注意をファイルを使用してファイルを実行します(irbからテストすると、次のエラーが発生します)。MethodSource::SourceNotFoundError: Could not load source for : No such file or directory @ rb_sysopen - (irb)

関連する問題