Ruby阻止字符串而不是执行

Ben*_*all 17 ruby

举个例子:

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.


aus*_*ton 1

您需要ruby​​2ruby gem,它可以很好地完成此任务。不幸的是,要分析一个块,这个 gem 依赖于 ParseTree,而Ruby 1.9 不支持 ParseTree