Ruby阻止字符串而不是执行

时间:2010-01-17 21:31:55

标签: ruby

举个例子:

write_as_string { puts 'x' }

然后我希望能够做到

def write_as_string(&block)
  puts block.to_s
end

当我执行此操作时,我希望输出为:

"puts 'x'"

我希望能够接收块并获取块的实际代码而不是执行它。

动机:创建DSL,我希望将模拟转换为许多其他方法调用,隐藏在调用代码中 - 使用现有的对象和方法,而不用猴子修补它们。

对此的任何想法都会很棒!

由于

3 个答案:

答案 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