He investigado getting the source code of a method si existe como un archivo, pero sin esta referencia de archivo, ¿es posible imprimir dinámicamente el código fuente de un método? Parece que puedo acceder a las firmas de métodos en la clase con self.methods y cada método .arity
. Creo que la gema ri_for se refiere al archivo fuente original.¿Puedo hacer que Ruby imprima el código fuente de un método dinámico?
Una mejor manera de enmarcar esta pregunta: Si una clase se extiende en tiempo de ejecución, ¿está a salvo de ser investigada su fuente? ¿O la capacidad de investigar está limitada a la firma del método y los nombres de las variables de instancia, quizás las variables de clase?
Editar: Solución I utilizado: http://seattlerb.rubyforge.org/svn/ruby2ruby/1.2.1/lib/ruby2ruby.rb
class Ruby2Ruby < SexpProcessor
def self.translate(klass_or_str, method = nil)
sexp = ParseTree.translate(klass_or_str, method)
unifier = Unifier.new
unifier.processors.each do |p|
p.unsupported.delete :cfunc
end
sexp = unifier.process(sexp)
self.new.process(sexp)
end
end
class Module
def to_ruby
Ruby2Ruby.translate(self)
end
end
pega este en algún lugar y se puede obtener un buen comienzo en conseguir el código fuente de una clase definida en tiempo de ejecución.
+1, pero ¿es ParseTree o Ruby2Ruby? –
Gracias, su respuesta me hizo ver SexpProcessor y desde allí pude extender la clase Module con un método ro_ruby que vacía todo el código fuente de la clase. – mike