我有一个阻止的方法。
显然我不知道会传递什么,并且出于奇怪的原因我不会进入这里我想要打印块的内容。
有办法做到这一点吗?
答案 0 :(得分: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的Chris Wanstrath发表的精彩演讲http://goruco2008.confreaks.com/03_wanstrath.html他展示了一些有趣的ruby2ruby和parsetree用例。
答案 1 :(得分:4)
在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代码......我们使用ParseTree和Ruby 1.8,现在sourcify with Ruby 1.9。
答案 2 :(得分:3)
在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)
答案 3 :(得分:2)
在Ruby 1.9中,您可以尝试从源文件中提取代码的gem。
答案 4 :(得分:1)
在 ruby 2.7 中,使用 method_source
gem(撬起取决于它)
Set.instance_method(:merge).source.display
# =>
def merge(enum)
if enum.instance_of?(self.class)
@hash.update(enum.instance_variable_get(:@hash))
else
do_with_enum(enum) { |o| add(o) }
end
self
end
repo 说它适用于 procs,但我还没有测试过。
答案 5 :(得分:0)
在 Ruby 2.5 中,以下工作
puts block.source