Come ottenere il nome del metodo di chiamata?

c’è un modo in Ruby per trovare il nome del metodo di chiamata all’interno di un metodo?

Per esempio:

class Test def self.foo Fooz.bar end end class Fooz def self.bar # get Test.foo or foo end end 

 puts caller[0] 

o forse…

 puts caller[0][/`.*'/][1..-2] 

In Ruby 2.0.0, puoi usare:

 caller_locations(1,1)[0].label 

È molto più veloce della soluzione Ruby 1.8+:

 caller[0][/`([^']*)'/, 1] 

Verrà incluso nei backports quando avrò il tempo (o una richiesta di pull!).

Usa caller_locations(1,1)[0].label (per ruby> = 2.0)

Modifica : La mia risposta stava dicendo di usare __method__ ma mi sbagliavo, restituisce il nome del metodo corrente, vedi questo gist .

Io uso

 caller[0][/`([^']*)'/, 1] 

Che ne dite di

 caller[0].split("`").pop.gsub("'", "") 

Molto più pulito.

Invece puoi scriverlo come funzione di libreria ed effettuare una chiamata ovunque sia necessario. Il codice è il seguente:

 module CallChain def self.caller_method(depth=1) parse_caller(caller(depth+1).first).last end private # Copied from ActionMailer def self.parse_caller(at) if /^(.+?):(\d+)(?::in `(.*)')?/ =~ at file = Regexp.last_match[1] line = Regexp.last_match[2].to_i method = Regexp.last_match[3] [file, line, method] end end end 

Per triggersre il metodo del modulo sopra è necessario chiamare in questo modo: caller = CallChain.caller_method

codice di riferimento da

Per vedere le informazioni sul chiamante e sul chiamato in qualsiasi lingua, sia essa ruby ​​o java o python, si vorrà sempre guardare la traccia dello stack. In alcune lingue, come Rust e C ++, ci sono opzioni integrate nel compilatore per triggersre una sorta di meccanismo di profilazione che è ansible visualizzare durante il runtime. Credo che esista per Ruby chiamato ruby-prof.

E come accennato in precedenza, è ansible esaminare la pila di esecuzione per ruby. Questo stack di esecuzione è un array contenente oggetti di localizzazione backtrace.

In sostanza tutto ciò che devi sapere su questo comando è il seguente:

chiamante (start = 1, length = nil) → array o nil