2009-11-04 8 views

risposta

9

Si può fare questo con Ruby2Ruby che implementa un metodo to_ruby.

require 'rubygems' 
require 'parse_tree' 
require 'parse_tree_extensions' 
require 'ruby2ruby' 

def meth &block 
    puts block.to_ruby 
end 

meth { some code } 

uscita volontà:

"proc { some(code) }" 

vorrei anche controllare questo impressionante discorso di Chris Wanstrath di Github http://goruco2008.confreaks.com/03_wanstrath.html Egli mostra alcuni interessanti esempi ruby2ruby e di utilizzo ParseTree.

+0

Funziona solo con Ruby 1.8? http://blog.zenspider.com/2009/04/parsetree-eol .html parla di "dropping block/proc support" per gestire Parse L'albero non è disponibile nel rubino 1.9. –

+0

No questo non funzionerà in Ruby 1.9 in quanto non fornisce i ganci necessari affinché ParseTree funzioni. A quanto pare ora è possibile ottenere il sexp in 1.9. Questo non è un problema enorme perché quando tutti fanno il passaggio ad altri 1.9 vms come Rubinius dovrebbero essere disponibili per prime time. Rubinius include nativamente un to_sexp per tutti gli oggetti, quindi sarà banale eseguire questo tipo di operazioni. –

3

Sulla risposta di Evangenieur, ecco la risposta di Corban se aveste Ruby 1.9:

# Works with Ruby 1.9 
require 'sourcify' 

def meth &block 
    # Note it's to_source, not to_ruby 
    puts block.to_source 
end 

meth { some code } 

La mia azienda utilizza questa opzione per visualizzare il codice Ruby usato per fare calcoli di carbonio ... abbiamo usato ParseTree con Ruby 1.8 e ora sourcify with Ruby 1.9.

2

In Ruby 1.9+ (testato con 2.1.2), è possibile utilizzare https://github.com/banister/method_source

Stampa la fonte tramite block#source:

#! /usr/bin/ruby 
require 'rubygems' 
require 'method_source' 

def wait &block 
    puts "Running the following code: #{block.source}" 
    puts "Result: #{yield}" 
    puts "Done" 
end 

def run! 
    x = 6 
    wait { x == 5 } 
    wait { x == 6 } 
end 

run! 

Nota che, per la sorgente da leggere è necessario utilizzare un file ed eseguire il file (testarlo da irb comporterà il seguente errore: MethodSource::SourceNotFoundError: Could not load source for : No such file or directory @ rb_sysopen - (irb)

Problemi correlati