Подтвердить что ты не робот

Печать исходного кода блока Ruby

У меня есть метод, который принимает блок.

Очевидно, я не знаю, что будет передано и для причудливых причин, по которым я не буду входить здесь. Я хочу распечатать содержимое блока.

Есть ли способ сделать это?

4b9b3361

Ответ 1

Вы можете сделать это с помощью 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.

Ответ 2

Основываясь на ответе 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.

Ответ 3

В Ruby 1.9 вы можете попробовать этот камень, который извлекает код из исходного файла.

https://github.com/ngty/sourcify

Ответ 4

В 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)