2011-01-26 9 views
18

Dato un oggetto Proc, è possibile guardare il codice al suo interno?Come estrarre il codice da un oggetto Proc?

Ad esempio:

p = Proc.new{test = 0} 

cosa ho bisogno è qualche modo per ottenere il "test = 0" stringa da un oggetto Proc che è già stato creato.

+0

Per le ricerche sul Web, un altro modo per dire che questo è "ispezionare il codice all'interno di un Proc." –

+0

Sono passati un paio di anni da quando è stata posta questa domanda. Qualcuno sa se ci sono stati sviluppi recenti in questo settore? – Ajedi32

+0

risposte più recenti: http://stackoverflow.com/a/15024732/109175 ("use sourcify") –

risposta

13

È possibile utilizzare la libreria 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 }" 

È possibile anche trasformare questa rappresentazione di stringa della schiena proc al rubino e chiamarlo:

>> eval(p.to_ruby).call 
0 

più su ruby2ruby in questo video: Hacking with ruby2ruby.

+0

Questo è un bel video, grazie per il link. – zetetic

2

Penso che potresti usare ParseTree per questo, sembra anche che il supporto per Ruby 1.9.2 sia getting close.

+1

ParseTree raggiunge EOL con Ruby 1.8. – weakish

10

Utilizzare proc.source_location per ottenere il percorso del file di origine che definisce il proc. Restituisce anche il numero di riga della definizione. È possibile utilizzare tali valori per individuare la posizione della sorgente proc.

+0

Questa non è letteralmente una risposta a questa domanda. Tuttavia, mi ha aiutato a eseguire il debug di un problema come questo in cui il proc non veniva da dove pensavo. Quindi +1 per quello. – AJFaraday

12

Nel caso in cui si sta utilizzando Ruby 1.9, è possibile utilizzare 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 gemma sourcify è ora non mantenuta: https://github.com/ngty/sourcify/issues/34#issuecomment-75375440 – Gerry

Problemi correlati