举个例子:
write_as_string { puts 'x' }
Run Code Online (Sandbox Code Playgroud)
然后我希望能够做到
def write_as_string(&block)
puts block.to_s
end
Run Code Online (Sandbox Code Playgroud)
当我执行此操作时,我希望输出为:
"puts 'x'"
Run Code Online (Sandbox Code Playgroud)
我希望能够接收块并获取块的实际代码而不是执行它.
动机:创建DSL,我希望将模拟转换为许多其他方法调用,隐藏在调用代码中 - 使用现有的对象和方法,而不用猴子修补它们.
对此的任何想法都会很棒!
谢谢
本
Sea*_*ere 19
如果您使用的是Ruby 1.9,则可以使用sourcify gem.它提供了Proc#to_source,就像ParseTree的Proc#to_ruby.
使用sourcify时,如果源代码中有嵌套的proc,则可能需要帮助它以及:attached_to选项:
## (Works in Ruby 1.8) Using ParseTree (with parse_tree_extensions)
block.to_ruby
## (Works in Ruby 1.9) Using sourcify
block.to_source
## Try this if you get Sourcify::NoMatchingProcError or Sourcify::MultipleMatchingProcsPerLineError
block.to_source :attached_to => :name_of_block_in_source_code
Run Code Online (Sandbox Code Playgroud)
我在公司的博客中发布了ParseTree和Ruby 1.9.