Gostaria de saber se posso obter o código-fonte de um método em tempo real e se posso obter em qual arquivo esse método está.
gostar
A.new.method(:a).SOURCE_CODE
A.new.method(:a).FILE
Use source_location
:
class A
def foo
end
end
file, line = A.instance_method(:foo).source_location
# or
file, line = A.new.method(:foo).source_location
puts "Method foo is defined in #{file}, line #{line}"
# => "Method foo is defined in temp.rb, line 2"
Observe que para métodos embutidos, source_location
retorna nil
. Se quiser verificar o código-fonte C (divirta-se!), Você terá que procurar o arquivo C correto (eles são mais ou menos organizados por classe) e encontrar o rb_define_method
para o método (no final do arquivo )
No Ruby 1.8, este método não existe, mas você pode usar esta joia .
String#include?
. Até agoraString.instance_method(:include?).source_location
retornanil
.Nenhuma das respostas até agora mostra como exibir o código-fonte de um método em tempo real ...
Na verdade, é muito fácil se você usar a incrível joia 'method_source' de John Mair (o criador do Pry): O método deve ser implementado em Ruby (não em C) e deve ser carregado de um arquivo (não em irb).
Aqui está um exemplo exibindo o código-fonte do método no console Rails com method_source:
Veja também:
fonte
source
. Isso funciona conforme o esperado.[1] pry(main)> RSpec.method(:class_exec).source
MethodSource::SourceNotFoundError: Could not locate source for class_exec!
from /home/vagrant/.bundle/foo/ruby/2.5.0/gems/method_source-0.9.2/lib/method_source.rb:24:in `source_helper'
RSpec.method(:to_json).source_location
funciona bemAqui está como imprimir o código-fonte do Ruby:
fonte
Sem dependências
Se você quiser usar isso de forma mais conveniente, pode abrir a
Method
classe:E então é só ligar
method.source
Com o Pry você pode usar o
show-method
para ver o código-fonte de um método, e você pode até mesmo ver algum código-fonte ruby c compry-doc
instalado, de acordo com o documento do pry em codde-browingfonte
source
método dentro daMethod
classe. Seria ainda melhor se processasse o texto e novo quando parar de imprimir porque chegou ao fim do método.Eu criei a gema "ri_for" para este propósito
... produz a fonte (e localização, se você estiver no 1.9).
GL. -r
fonte
Tive que implementar um recurso semelhante (pegar a fonte de um bloco) como parte do Wrong e você pode ver como (e talvez até mesmo reutilizar o código) em chunk.rb (que depende do RubyParser de Ryan Davis, bem como de alguns código de glomming do arquivo fonte ). Você teria que modificá-lo para usar
Method#source_location
e talvez ajustar algumas outras coisas para que inclua ou não odef
.BTW, acho que o Rubinius tem esse recurso embutido. Por algum motivo, ele foi deixado de fora do MRI (a implementação padrão do Ruby), daí este hack.
Oooh, eu gosto de algumas das coisas em method_source ! É como usar eval para dizer se uma expressão é válida (e continuar glomming as linhas de origem até parar de receber erros de análise, como o Chunk faz) ...
fonte
Métodos internos não têm fonte ou localização de fonte (por exemplo
Integer#to_s
)fonte