$0
é a variável para o programa Ruby de nível superior, mas existe uma para o método atual?
ruby
reflection
metaprogramming
salt.racer
fonte
fonte
super
pode ser chamado dentro de um objeto SimpleDelegator:def description; __getobj__.respond_to?(__method__) ? super : 'No description'; end
Respostas:
Ainda melhor do que minha primeira resposta, você pode usar __method__:
Isso retorna um símbolo - por exemplo
:test_method
,. Para retornar o nome do método como uma sequência, chame__method__.to_s
.Nota: Isso requer Ruby 1.8.7.
fonte
__method__.to_s
e será o nome do método, nada mais #Em http://snippets.dzone.com/posts/show/2785 :
fonte
__callee__
faz isso?Dependendo do que você realmente deseja, você pode usar
__method__
or ou__callee__
, que retornam o nome do método atualmente em execução como um símbolo.No ruby 1.9, os dois se comportam de forma idêntica (no que diz respeito aos documentos e meus testes).
No ruby 2.1 e 2.2
__callee__
se comporta de maneira diferente se você chamar um alias do método definido. Os documentos para os dois são diferentes:__method__
: "o nome na definição do método atual" (ou seja, o nome como foi definido)__callee__
: "o nome chamado do método atual" (ou seja, o nome como foi chamado (chamado))Script de teste:
1.9.3 Saída:
2.1.2 Saída (
__callee__
retorna o nome alternativo, mas__method__
retorna o nome no ponto em que o método foi definido):fonte
Para Ruby 1.9+, eu recomendo usar
__callee__
fonte
__callee__
se comporta de maneira diferente antes de 1.9, por isso é melhor manter-se,__method__
pois ele tem um comportamento consistente.__callee__
se comporta da mesma maneira que__method__
após 1.9.def m1() puts("here is #{__method__} method. My caller is #{__callee__}.") end; def m2() puts("here is #{__method__} method. Let's call m1"); m1 end; m2
Você não vê nada de estranho?__callee__
e agora__method__
tem um comportamento diferente. Veja pastie.org/10380985 (ruby 2.1.5)Eu tenho o mesmo problema para recuperar o nome do método no arquivo de exibição. Eu tenho a solução
se você deseja obter o nome do controlador,
fonte