2009-11-04 15 views

Respuesta

9

Puede hacerlo con Ruby2Ruby que implementa un método to_ruby.

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

def meth &block 
    puts block.to_ruby 
end 

meth { some code } 

la Salida:

"proc { some(code) }" 

También me echa un vistazo a esta charla impresionante por Chris Wanstrath de Github http://goruco2008.confreaks.com/03_wanstrath.html Se muestra algunos ejemplos de uso y ruby2ruby árbol de traducción interesantes.

+0

¿Funciona solo con Ruby 1.8? http://blog.zenspider.com/2009/04/parsetree-eol .html habla sobre "dejar caer el soporte de bloque/proc" para tratar con Parse Árbol no disponible en ruby ​​1.9. –

+0

No, esto no funcionará en ruby ​​1.9 ya que no proporciona los ganchos necesarios para que ParseTree funcione. Aparentemente no hay manera de obtener el sexp en 1.9. Este no es un gran problema porque para cuando todos hagan el cambio a 1.9 otros vms como rubinius deberían estar disponibles para el horario de máxima audiencia. Rubinius incluye de forma nativa to_sexp para todos los objetos, por lo que será trivial realizar este tipo de operaciones. –

3

Sobre la base de la respuesta de Evangenieur, aquí está la respuesta de Corbán si tuviera 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 } 

Mi compañía utiliza esta opción para visualizar el código Ruby utilizado para hacer los cálculos de carbono ... utilizamos árbol de traducción con Ruby 1.8 y ahora sourcify with Ruby 1.9.

2

En Rubí 1.9+ (probado con 2.1.2), puede utilizar https://github.com/banister/method_source

Imprimir la fuente a través de 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! 

Tenga en cuenta que para que la fuente que va a leer lo que necesita utilizar un archivo y ejecutar el archivo (probarlo desde irb dará como resultado el siguiente error: MethodSource::SourceNotFoundError: Could not load source for : No such file or directory @ rb_sysopen - (irb)

Cuestiones relacionadas