2011-04-25 57 views
7

這可能嗎?打印塊的實際Ruby代碼?

def block_to_s(&blk) 
    #code to print blocks code here 
end 

puts block_to_s do 
    str = "Hello" 
    str.reverse! 
    print str 
end 

這將打印後續的終端:

str = "Hello" 
str.reverse! 
print str 

回答

8

這個問題是涉及到:

安德魯建議我,當我問這個列表中的第一個。通過使用寶石「sourcify」,你可以得到的東西接近塊,但不完全一樣:

require 'sourcify' 

def block_to_s(&blk) 
    blk.to_source(:strip_enclosure => true) 
end 

puts block_to_s { 
    str = "Hello" 
    str.reverse! 
    print str 
} 

在上面,通知你要麼必須把周圍的putsblock_to_s參數括號.. end),或者使用{...}而不是do ... end,因爲連續性的強度在堆棧中反覆討論。

這會給你:

str = "Hello" 
str.reverse! 
print(str) 

這相當於原來的塊作爲一個Ruby腳本,但不完全相同的字符串。

+4

在Ruby 2.0中,您可以使用#source打印proc作爲字符串。 #to_source不再有效。 – mpiccolo 2014-01-19 08:39:28

+0

你需要包含'method_source' gem(你需要在一個文件中,它不適用於我的irb) – Nick 2016-04-15 18:24:53