Как извлечь код из объекта Proc?
Учитывая объект Proc, можно ли просмотреть код внутри него?
Например:
p = Proc.new{test = 0}
Мне нужно каким-то образом получить строку "test = 0" из уже созданного объекта Proc.
Ответы
Ответ 1
Вы можете использовать библиотеку ruby2ruby:
>> # tested with 1.8.7
>> require "parse_tree"
=> true
>> require "ruby2ruby"
=> true
>> require "parse_tree_extensions"
=> true
>> p = Proc.new{test = 0}
>> p.to_ruby
=> "proc { test = 0 }"
Вы также можете включить это строковое представление proc back to ruby и вызвать его:
>> eval(p.to_ruby).call
0
Подробнее о ruby2ruby в этом видео: Взлом с ruby2ruby.
Ответ 2
Если вы используете Ruby 1.9, вы можете использовать драгоценный камень sourcify
$ irb
ruby-1.9.2-p0 > require 'sourcify'
=> true
ruby-1.9.2-p0 > p = Proc.new{test = 0}
=> #<Proc:[email protected](irb):2>
ruby-1.9.2-p0 > p.to_source
=> "proc { test = 0 }"
Ответ 3
Используйте proc.source_location
, чтобы получить расположение исходного файла, который определяет proc.
Он также возвращает номер строки определения.
Эти значения можно использовать для определения местоположения источника proc.
Ответ 4
Я думаю, вы могли бы использовать ParseTree для этого, также кажется, что поддержка Ruby 1.9.2 - это приближается.