c'è un modo in Ruby per trovare il nome del metodo chiamante 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
c'è un modo in Ruby per trovare il nome del metodo chiamante 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
Risposte:
puts caller[0]
o forse...
puts caller[0][/`.*'/][1..-2]
caller[0][/`(.*)'/,1]
"block in make_lambda"
. Immagino che questo sia solo per Ruby.
In Ruby 2.0.0 è possibile utilizzare:
caller_locations(1,1)[0].label
È molto più veloce della soluzione Ruby 1.8+:
caller[0][/`([^']*)'/, 1]
Sarà incluso in backports
quando avrò il tempo (o una richiesta pull!).
caller_locations[0].label
su Ruby 2.2.0 altrimenti hai sempre un send_action
risultato
Usa caller_locations(1,1)[0].label
(per rubino> = 2.0)
Modifica : la mia risposta diceva di usare __method__
ma mi sbagliavo, restituiva il nome del metodo corrente.
Io uso
caller[0][/`([^']*)'/, 1]
'
al di là di quello che stai cercando (e presumo che non sia possibile), il risultato sarà lo stesso, certo. Tuttavia, [^']*
funzionerà meglio poiché il motore regex smetterà di cercare di abbinare quella parte all'espressione nel momento in cui raggiunge una '
(la tua versione andrà alla fine, quindi tornerà indietro perché non ha trovato una '
alla fine). La differenza è piuttosto trascurabile in questo caso ovviamente, ma è una buona abitudine evitare .
nelle regex ove possibile.
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 attivare il metodo del modulo sopra è necessario chiamare in questo modo:
caller = CallChain.caller_method
Per vedere le informazioni sul chiamante e sul chiamante in qualsiasi lingua, che si tratti di ruby, java o python, dovresti sempre guardare la traccia dello stack. In alcune lingue, come Rust e C ++, ci sono opzioni integrate nel compilatore per attivare una sorta di meccanismo di profilazione che è possibile visualizzare durante il runtime. Credo che ne esista uno per Ruby chiamato ruby-prof.
E come accennato in precedenza, potresti cercare nello stack di esecuzione il rubino. Questo stack di esecuzione è un array contenente oggetti di posizione backtrace.
Fondamentalmente tutto ciò che devi sapere su questo comando è il seguente:
chiamante (inizio = 1, lunghezza = zero) → array o zero