$0
é a variável para o programa Ruby de nível superior, mas existe uma para o método atual?
$0
é a variável para o programa Ruby de nível superior, mas existe uma para o método atual?
Respostas:
Ainda melhor do que minha primeira resposta, você pode usar __method__:
class Foo
def test_method
__method__
end
end
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.
__method__.to_s
e será o nome do método, nada mais #
Em http://snippets.dzone.com/posts/show/2785 :
module Kernel
private
def this_method_name
caller[0] =~ /`([^']*)'/ and $1
end
end
class Foo
def test_method
this_method_name
end
end
puts Foo.new.test_method # => test_method
__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:
require 'pp'
puts RUBY_VERSION
class Foo
def orig
{callee: __callee__, method: __method__}
end
alias_method :myalias, :orig
end
pp( {call_orig: Foo.new.orig, call_alias: Foo.new.myalias} )
1.9.3 Saída:
1.9.3
{:call_orig=>{:callee=>:orig, :method=>:orig},
:call_alias=>{:callee=>:orig, :method=>:orig}}
2.1.2 Saída ( __callee__
retorna o nome alternativo, mas __method__
retorna o nome no ponto em que o método foi definido):
2.1.2
{:call_orig=>{:callee=>:orig, :method=>:orig},
:call_alias=>{:callee=>:myalias, :method=>:orig}}
Para Ruby 1.9+, eu recomendo usar __callee__
__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
params[:action] # it will return method's name
se você deseja obter o nome do controlador,
params[:controller] # it will return you controller's name
super
pode ser chamado dentro de um objeto SimpleDelegator:def description; __getobj__.respond_to?(__method__) ? super : 'No description'; end