2011-01-26 13 views
18

Dado un objeto Proc, ¿es posible mirar el código dentro de él?¿Cómo extraer el código de un objeto Proc?

Por ejemplo:

p = Proc.new{test = 0} 

Lo que necesito es alguna manera de obtener el "test = 0" cadena de un objeto Proc que ya ha sido creado.

+0

Para búsquedas en la web, otra forma de decir esto es "inspeccionar el código dentro de un Proc." –

+0

Han pasado un par de años desde que se hizo esta pregunta. ¿Alguien sabe si ha habido algún desarrollo reciente en esta área? – Ajedi32

+0

respuestas más recientes: http://stackoverflow.com/a/15024732/109175 ("use sourcify") –

Respuesta

13

Puede utilizar el ruby2ruby biblioteca:

>> # 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 }" 

También puede convertir esta representación de cadena de la parte posterior proc al rubí y lo llaman:

>> eval(p.to_ruby).call 
0 

Más sobre ruby2ruby en este video: Hacking with ruby2ruby.

+0

Es un gran video, gracias por el enlace. – zetetic

2

Creo que podría usar ParseTree para esto, también parece que el soporte para Ruby 1.9.2 es getting close.

+1

ParseTree llega a EOL con Ruby 1.8. – weakish

10

Utilice proc.source_location para obtener la ubicación del archivo fuente que define el proceso. También devuelve el número de línea de la definición. Puede usar esos valores para localizar la ubicación de la fuente de proc.

+0

Esto no es literalmente una respuesta a esta pregunta. Sin embargo, me ayudó a depurar un problema como este donde el proceso no venía de donde yo creía. Entonces +1 por eso. – AJFaraday

12

En caso de que esté usando Ruby 1.9, puede utilizar the sourcify gem

$ 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

La gema sourcify ahora no se ha mantenido: https://github.com/ngty/sourcify/issues/34#issuecomment-75375440 – Gerry

Cuestiones relacionadas