Comment obtenir le nom de la méthode d’appel?

Y a-t-il un moyen dans Ruby de trouver le nom de la méthode d’appel à 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 

 puts caller[0] 

ou peut-être…

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

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 les backports lorsque j’aurai le temps (ou une demande de tirage!).

Utilisez caller_locations(1,1)[0].label (pour ruby> = 2.0)

Edit : Ma réponse a été d’utiliser __method__ mais je me suis trompé, il retourne le nom de la méthode en cours, voir cet aperçu.

j’utilise

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

Que diriez-vous

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

Beaucoup plus propre imo.

Au lieu de cela, vous pouvez l’écrire en tant que fonction de bibliothèque et passer un appel où vous le souhaitez. Le code va comme suit:

 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

référence de code de

Pour voir les informations de l’appelant et de l’appelé dans n’importe quelle langue, que ce soit ruby, java ou python, vous voudrez toujours consulter la trace de la stack. Dans certaines langues, telles que Rust et C ++, il existe des options intégrées dans le compilateur pour activer un mécanisme de profilage que vous pouvez afficher pendant l’exécution. Je crois que l’un existe pour Ruby appelé ruby-prof.

Et comme mentionné ci-dessus, vous pourriez regarder dans la stack d’exécution pour Ruby. Cette stack d’exécution est un tableau contenant des objects de localisation de backtrace.

Tout ce que vous devez savoir sur cette commande est essentiellement le suivant:

appelant (start = 1, length = nil) → tableau ou nil