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?


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.


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


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}}

10

Para Ruby 1.9+, eu recomendo usar __callee__


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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.