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.