Ottieni il nome del metodo attualmente in esecuzione


198

$0 è la variabile per il programma Ruby di livello superiore, ma ce n'è una per il metodo attuale?


Un uso è il controllo superpuò essere chiamato all'interno di un oggetto SimpleDelegator:def description; __getobj__.respond_to?(__method__) ? super : 'No description'; end
— Kris

Risposte:


334

Anche meglio della mia prima risposta puoi usare __method__:

class Foo
  def test_method
    __method__
  end
end

Ciò restituisce un simbolo, ad esempio :test_method. Per restituire il nome del metodo come stringa, chiamare __method__.to_sinvece.

Nota: questo richiede Ruby 1.8.7.


11
il ':' è solo il simbolo simbolo. :) basta farlo __method__.to_se sarà il nome del metodo, nient'altro
— Lambart

Cosa succede se sono in attività di rake?
— Imran Ahmad,

24

Da 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

5
Questo mi è stato molto utile per trovare il nome del metodo chiamante (al contrario dell'attuale).
— Lambart,

Non __callee__lo fa?
— Joshua Pinter,

Ottima soluzione Mark La migliore soluzione al momento. Ottimo lavoro
— jonathanccalixto

18

A seconda di ciò che si desidera effettivamente, è possibile utilizzare __method__o__callee__ , che restituisce il simbolo del metodo attualmente in esecuzione come simbolo.

Su ruby ​​1.9, entrambi si comportano in modo identico (per quanto riguarda i documenti e i miei test).

Su ruby ​​2.1 e 2.2 __callee__si comporta diversamente se si chiama un alias del metodo definito. I documenti per i due sono diversi:

  • __method__: "il nome alla definizione del metodo corrente" (ovvero il nome così come è stato definito)
  • __callee__: "il nome chiamato del metodo corrente" (ovvero il nome come è stato chiamato (invocato))

Script di prova:

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 Uscita:

1.9.3
{:call_orig=>{:callee=>:orig, :method=>:orig},
 :call_alias=>{:callee=>:orig, :method=>:orig}}

2.1.2 Output ( __callee__restituisce il nome con alias, ma __method__restituisce il nome nel punto in cui è stato definito il metodo):

2.1.2
{:call_orig=>{:callee=>:orig, :method=>:orig},
 :call_alias=>{:callee=>:myalias, :method=>:orig}}

10

Per Ruby 1.9+ consiglierei di usare __callee__


3
__callee__si comporta in modo diverso prima di 1.9, quindi è meglio attenersi __method__poiché ha un comportamento coerente. __callee__si comporta come __method__dopo 1.9.
— Leigh McCulloch,

@LeighMcCulloch puoi spiegare la differenza con un esempio (possibilmente in una nuova risposta)?
— Ciro Santilli 11 冠状 病 六四 事件 法轮功

@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; m2Non vedi niente di strano?
— jgburet,

4
@LeighMcCulloch attualmente __callee__e __method__ha un comportamento diverso. Vedi pastie.org/10380985 (ruby 2.1.5)
— goodniceweb

1
pastie.org non funziona. Per sempre o solo ora?
— Nakilon,

-3

Ho avuto lo stesso problema per recuperare il nome del metodo nel file di visualizzazione. Ho ottenuto la soluzione

params[:action] # it will return method's name

se vuoi ottenere il nome del controller allora

params[:controller] # it will return you controller's name

4
Penso che tu abbia interpretato erroneamente la domanda sulle azioni del controller delle rotaie e sui metodi http ... questa risposta dovrebbe probabilmente essere cancellata.
— Factor Mystic,

Utile per ottenere il nome del metodo attualmente in esecuzione (controller) dalla vista.
— avjaarsveld,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.