Как извлечь код из объекта Proc? - PullRequest
20 голосов
/ 27 января 2011

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

Например:

p = Proc.new{test = 0}

Мне нужен какой-то способ получить строку «test = 0» из объекта Proc, который уже был создан.

Ответы [ 4 ]

15 голосов
/ 27 января 2011

Вы можете использовать библиотеку 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 }"

Вы также можете превратить это строковое представление процедуры обратно в ruby ​​и вызвать его:

>> eval(p.to_ruby).call
0

Подробнее о ruby2ruby в этом видео: Взлом с помощью ruby2ruby .

13 голосов
/ 27 января 2011

Если вы используете Ruby 1.9, вы можете использовать камень sourcify

$ irb
ruby-1.9.2-p0 > require 'sourcify'
             => true 
ruby-1.9.2-p0 > p = Proc.new{test = 0}
             => #<Proc:0xa4b166c@(irb):2> 
ruby-1.9.2-p0 > p.to_source
             => "proc { test = 0 }" 
11 голосов
/ 27 января 2011

Используйте proc.source_location, чтобы получить местоположение исходного файла, который определяет proc.Он также возвращает номер строки определения.Вы можете использовать эти значения для определения местоположения источника процесса.

2 голосов
/ 27 января 2011

Я думаю, вы могли бы использовать ParseTree для этого, также кажется, что поддержка Ruby 1.9.2 приближается .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...