y a-t-il un moyen dans Ruby de trouver le nom de la méthode appelante à l'intérieur d'une méthode?
Par exemple:
class Test
def self.foo
Fooz.bar
end
end
class Fooz
def self.bar
# get Test.foo or foo
end
end
y a-t-il un moyen dans Ruby de trouver le nom de la méthode appelante à l'intérieur d'une méthode?
Par exemple:
class Test
def self.foo
Fooz.bar
end
end
class Fooz
def self.bar
# get Test.foo or foo
end
end
Réponses:
puts caller[0]
ou peut-être...
puts caller[0][/`.*'/][1..-2]
caller[0][/`(.*)'/,1]
"block in make_lambda"
. Je suppose que c'est pour Ruby uniquement.
Dans Ruby 2.0.0, vous pouvez utiliser:
caller_locations(1,1)[0].label
C'est beaucoup plus rapide que la solution Ruby 1.8+:
caller[0][/`([^']*)'/, 1]
Sera inclus dans backports
quand j'aurai le temps (ou une pull request!).
caller_locations[0].label
sur Ruby 2.2.0 sinon vous avez toujours le send_action
résultat
Utilisez caller_locations(1,1)[0].label
(pour rubis> = 2.0)
Edit : Ma réponse disait d'utiliser __method__
mais j'avais tort, elle renvoie le nom de la méthode actuelle.
j'utilise
caller[0][/`([^']*)'/, 1]
'
au-delà de celle que vous recherchez (et je suppose que ce n'est pas le cas), le résultat sera le même, bien sûr. Cependant, [^']*
cela fonctionnera mieux car le moteur d'expression régulière arrêtera d'essayer de faire correspondre cette partie à l'expression au moment où il atteint a '
(votre version ira à la fin, puis reviendra parce qu'elle n'a pas trouvé de '
à la fin). La différence est assez négligeable dans ce cas bien sûr, mais c'est une bonne habitude à éviter .
dans les regex si possible.
Que diriez-vous
caller[0].split("`").pop.gsub("'", "")
Imo beaucoup plus propre.
Au lieu de cela, vous pouvez l'écrire en tant que fonction de bibliothèque et faire un appel là où c'est nécessaire. Le code est le suivant:
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
Pour déclencher la méthode de module ci-dessus, vous devez appeler comme ceci:
caller = CallChain.caller_method
Afin de voir les informations sur l'appelant et l'appelé dans n'importe quel langage, que ce soit ruby, java ou python, vous voudrez toujours regarder la trace de la pile. Dans certains langages, tels que Rust et C ++, il existe des options intégrées au compilateur pour activer une sorte de mécanisme de profilage que vous pouvez afficher pendant l'exécution. Je crois qu'il en existe un pour Ruby appelé ruby-prof.
Et comme mentionné ci-dessus, vous pouvez consulter la pile d'exécution pour ruby. Cette pile d'exécution est un tableau contenant des objets d'emplacement de trace arrière.
Tout ce que vous devez savoir sur cette commande est essentiellement le suivant:
appelant (début = 1, longueur = nil) → tableau ou nil