У меня есть метод, который принимает блок.
Очевидно, я не знаю, что будет передано и для причудливых причин, по которым я не буду входить здесь. Я хочу распечатать содержимое блока.
Есть ли способ сделать это?
У меня есть метод, который принимает блок.
Очевидно, я не знаю, что будет передано и для причудливых причин, по которым я не буду входить здесь. Я хочу распечатать содержимое блока.
Есть ли способ сделать это?
Вы можете сделать это с помощью Ruby2Ruby, который реализует метод to_ruby.
require 'rubygems'
require 'parse_tree'
require 'parse_tree_extensions'
require 'ruby2ruby'
def meth &block
puts block.to_ruby
end
meth { some code }
выведет:
"proc { some(code) }"
Я также рассмотрю этот замечательный разговор Криса Вантрата из Github http://goruco2008.confreaks.com/03_wanstrath.html Он показывает некоторые интересные примеры использования ruby2ruby и parsetree.
Основываясь на ответе Evangenieur, здесь Corban ответ, если у вас был Ruby 1.9:
# Works with Ruby 1.9
require 'sourcify'
def meth &block
# Note it to_source, not to_ruby
puts block.to_source
end
meth { some code }
Моя компания использует это для отображения кода Ruby, используемого для расчета углеродов... мы использовали ParseTree с Ruby 1.8 и теперь sourcify с Ruby 1.9.
В Ruby 1.9 вы можете попробовать этот камень, который извлекает код из исходного файла.
В Ruby 1.9+ (проверено с 2.1.2) вы можете использовать https://github.com/banister/method_source
Распечатайте источник через block#source
:
#! /usr/bin/ruby
require 'rubygems'
require 'method_source'
def wait &block
puts "Running the following code: #{block.source}"
puts "Result: #{yield}"
puts "Done"
end
def run!
x = 6
wait { x == 5 }
wait { x == 6 }
end
run!
Обратите внимание, что для чтения источника вам необходимо использовать файл и выполнить файл (проверка его из irb приведет к следующей ошибке: MethodSource::SourceNotFoundError: Could not load source for : No such file or directory @ rb_sysopen - (irb)