У этого вопроса уже есть ответ здесь:
Возьмите этот пример:
write_as_string { puts 'x' }
Я тогда хочу быть в состоянии сделать
def write_as_string(&block)
puts block.to_s
end
Когда я выполняю это, я хочу, чтобы продукция была:
"puts 'x'"
Я хочу быть в состоянии получить блок и получить фактический кодекс для блока вместо того, чтобы выполнить его.
Мотивация: Создавая DSL, я хочу к насмешке быть преобразованным во многие другие требования метода, скрытые от кодекса запроса - использование существующих объектов и методов без обезьяны, исправляющей их.
Любые идеи об этом были бы прекрасными!
Спасибо
Бен
Вы хотите RUBY2RUBY GEM , который делает это красиво. К сожалению, для анализа блока этот драгоценный камень зависит от Parsetree, который представляет собой , неподдерживаемый в Ruby 1,9 .
Дубликат: Печать исходного кода блока Ruby
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\") }"