Obter o nome do método atualmente em execução

198

$0 é a variável para o programa Ruby de nível superior, mas existe uma para o método atual?

salt.racer
fonte
Um uso é a verificação superpode ser chamado dentro de um objeto SimpleDelegator:def description; __getobj__.respond_to?(__method__) ? super : 'No description'; end
Kris

Respostas:

334

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.

Mark A. Nicolosi
fonte
11
o ':' é apenas o símbolo do símbolo. :) apenas faça __method__.to_se será o nome do método, nada mais #
Lambart 25/09/2013
E se eu estiver na tarefa rake?
Imran Ahmad
24

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
Mark A. Nicolosi
fonte
5
Isso foi muito útil para encontrar o nome do método de chamada (em oposição ao atual).
Lambart 27/09/13
Não __callee__faz isso?
Joshua Pinter
Ótima solução Mark A melhor solução no momento. Great job
jonathanccalixto
18

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}}
Kelvin
fonte
10

Para Ruby 1.9+, eu recomendo usar __callee__

l3x
fonte
3
__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.
precisa saber é o seguinte
@LeighMcCulloch você pode explicar a diferença com um exemplo (possivelmente em uma nova resposta)?
Ciro Santilli escreveu
@CiroSantilli 视 事件 法轮功 纳米比亚 视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; m2Você não vê nada de estranho?
jgburet
4
@LeighMcCulloch atualmente __callee__e agora __method__tem um comportamento diferente. Veja pastie.org/10380985 (ruby 2.1.5)
goodniceweb 28/08/2015
1
pastie.org está desativado. Para sempre ou agora?
Nakilon
-3

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
Hetal Khunti
fonte
4
Eu acho que você interpretou mal a pergunta sobre ações do controlador rails e métodos http ... essa resposta provavelmente deve ser excluída.
Fator Mystic
Útil para obter o nome do método atualmente em execução (controlador) da exibição.
precisa saber é o seguinte