举个例子:
write_as_string { puts 'x' }
然后我希望能够做到
def write_as_string(&block)
puts block.to_s
end
当我执行此操作时,我希望输出为:
"puts 'x'"
我希望能够接收块并获取块的实际代码而不是执行它。
动机:创建DSL,我希望将模拟转换为许多其他方法调用,隐藏在调用代码中 - 使用现有的对象和方法,而不用猴子修补它们。
对此的任何想法都会很棒!
由于
本
答案 0 :(得分: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
我在我公司的博客中发布了ParseTree and Ruby 1.9。
答案 1 :(得分:3)
重复:Printing the source code of a Ruby block
sudo gem install ParseTree
sudo gem install ruby2ruby
然后
require 'rubygems'
require 'parse_tree'
require 'parse_tree_extensions'
require 'ruby2ruby'
def block_as_string &block
block.to_ruby
end
结果
irb(main):008:0> block_as_string {puts 'x'}
=> "proc { puts(\"x\") }"
答案 2 :(得分:1)
你想要ruby2ruby gem,这很好地做到了这一点。不幸的是,要分析一个块,这个gem取决于ParseTree,它是unsupported in Ruby 1.9。