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

Как извлечь код из объекта Proc?

Учитывая объект Proc, можно ли просмотреть код внутри него?

Например:

p = Proc.new{test = 0}

Мне нужно каким-то образом получить строку "test = 0" из уже созданного объекта Proc.

4b9b3361

Ответ 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 - это приближается.