2011-04-25 55 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