2009-11-04 60 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) }" 

我也想看看通過Github上的克里斯Wanstrath爲此這真棒談話http://goruco2008.confreaks.com/03_wanstrath.html他展示了一些有趣的ruby2ruby和分析樹使用的例子。

+0

這隻適用於Ruby 1.8嗎?http://blog.zenspider.com/2009/04/parsetree-eol .html討論了「丟棄塊/ proc支持」來處理Parse樹沒有在紅寶石1.9可用。 – 2009-11-04 22:21:19

+0

不,這不會在Ruby 1.9中工作,因爲它不提供ParseTree工作所需的鉤子。顯然現在有1.9的性別。這不是一個巨大的問題,因爲到了每個人轉換到1.9的其他vms時,rubinius應該在黃金時段可用。 Rubinius原生包含了一個to_sexp用於所有對象,因此執行這些操作很簡單。 – 2009-11-05 04:01:34

3

上Evangenieur的回答大廈,這裏的古爾邦節的答案,如果你有紅寶石1.9:

# 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

2

在Ruby 1.9+(與2.1.2測試),你可以使用https://github.com/banister/method_source

打印出源通過block#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)