Рубиновый блок, чтобы натянуть вместо того, чтобы выполнить [дублирует]

У этого вопроса уже есть ответ здесь:

Возьмите этот пример:

write_as_string { puts 'x' }

Я тогда хочу быть в состоянии сделать

def write_as_string(&block)
  puts block.to_s
end

Когда я выполняю это, я хочу, чтобы продукция была:

"puts 'x'"

Я хочу быть в состоянии получить блок и получить фактический кодекс для блока вместо того, чтобы выполнить его.

Мотивация: Создавая DSL, я хочу к насмешке быть преобразованным во многие другие требования метода, скрытые от кодекса запроса - использование существующих объектов и методов без обезьяны, исправляющей их.

Любые идеи об этом были бы прекрасными!

Спасибо

Бен

17
задан Phil Ross 17 January 2010 в 21:41
поделиться

2 ответа

Вы хотите RUBY2RUBY GEM , который делает это красиво. К сожалению, для анализа блока этот драгоценный камень зависит от Parsetree, который представляет собой , неподдерживаемый в Ruby 1,9 .

1
ответ дан 30 November 2019 в 13:27
поделиться

Дубликат: Печать исходного кода блока 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\") }"
3
ответ дан 30 November 2019 в 13:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: