Tengo un método que requiere un bloque.Imprimir el código fuente de un bloque de Ruby
Obviamente no sé lo que se va a pasar y por razones extrañas que no entraré aquí quiero imprimir el contenido del bloque.
¿Hay alguna manera de hacerlo?
Tengo un método que requiere un bloque.Imprimir el código fuente de un bloque de Ruby
Obviamente no sé lo que se va a pasar y por razones extrañas que no entraré aquí quiero imprimir el contenido del bloque.
¿Hay alguna manera de hacerlo?
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.
En Ruby 1.9, puede probar esta gema que extrae el código del archivo fuente.
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.
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)
¿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. –
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. –