Ruby: Obter o código-fonte de um método

Palavras-chave: Ruby, código fonte, ruby2ruby

Podemos obter o código de um método como uma String usando a gem ruby2ruby:

require "rubygems"
require "ruby2ruby"

class Teste
   def metodo
      puts "oi!"
   end
end

teste = Teste.new
metodo = teste.method(:metodo)
puts metodo.to_ruby

Rodando o código:

$ ruby r2r.rb
def metodo
  puts("oi!")
end

Vale mencionar que isso só funciona nos métodos de uma instância.

This entry was posted in Ruby. Bookmark the permalink.

8 Responses to Ruby: Obter o código-fonte de um método

  1. Alan Vitor says:

    Existe algo parecido para Python?

  2. TaQ says:

    Ih rapaz, não sei se tem isso em Python não!
    Oswaldo, cadê você? :-)

  3. Não tem não. É um pouco mais complicado de implementar algo semelhante em Python porque os trechos de código são compilados para bytecode. Seria preciso uma espécie de “descompilador” Python para voltar a ter acesso ao código fonte original de uma função/método.

    É possível acessar as instruções de bytecode, mas não é muito útil para o uso de alguém que não trabalhe com o desenvolvimento da própria linguagem.

    TaQ, o Ruby não compila o código para bytecode, né? (não é uma questão retórica, é só uma dúvida mesmo).

  4. TaQ says:

    Fala Osvaldo (agora acertei o V, desculpe pelo W)! Eu pedi um help pois havia procurado algo do tipo mas não havia encontrado …
    Não, Ruby ainda não compila para bytecode não. Reza a lenda que vamos ter bytecodes redondinhos na versão 2.0, mas ainda tem um bom chão pela frente. :-)
    Você levantou uma questão interessante: quando Ruby tiver bytecodes, será que a turma do ruby2ruby vai fazer um decompiler? Vamos ficar de olho.
    Abraços procêis!

  5. O python provê informacão de onde o código gerado veio, se você tiver os códigos, fica fácil de achar:

    def f(): pass
    print f.func_code.co_filename
    print f.func_code.co_firstlineno

    Claro que existe o facilitador “inspect”:

    import inspect
    inspect.getsource(f)

  6. Fagnasa says:

    Este tipo de descompilador podia vir direto das linguagens de programação.
    Por exemplo, cada método tivesse em seu código uma descrição dizendo como foi feito e tals.

  7. Fagnasa says:

    A aqui não está dando certo :\
    Está dando erro

Comments are closed.