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 backportsquando avrò il tempo (o una richiesta pull!).
caller_locations[0].labelsu Ruby 2.2.0 altrimenti hai sempre un send_actionrisultato
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