私はブロックを取るメソッドを持っています。Rubyブロックのソースコードを印刷する
明らかに私は何が渡されるのかわからないし、私がここに行かないという奇妙な理由から、ブロックの内容を印刷したいと思います。
これを行う方法はありますか?
私はブロックを取るメソッドを持っています。Rubyブロックのソースコードを印刷する
明らかに私は何が渡されるのかわからないし、私がここに行かないという奇妙な理由から、ブロックの内容を印刷したいと思います。
これを行う方法はありますか?
これは、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ことで、この素晴らしい話をチェックアウトします。
Ruby 1.9では、ソースファイルからコードを抽出するこのgemを試すことができます。
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で
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)
これはRuby 1.8でのみ動作しますかhttp://blog.zenspider.com/2009/04/parsetree-eol .htmlはParseを処理するための "ブロック/ procサポートの削除"について語るRuby 1.9ではツリーが使用できません。 –
これは、ParseTreeが動作するのに必要なフックを提供しないため、ルビ1.9では機能しません。どうやら、1.9でsexpを取得するnowayがあります。これは巨大な問題ではありません。なぜなら、誰もがルビニウスのような1.9の他のvmsをプライムタイムで利用できるようにする必要があるからです。 Rubiniusにはすべてのオブジェクトのto_sexpがネイティブに含まれているため、このような操作を行うのは簡単です。 –