185 votes

Comment obtenir le nom de la méthode appelante ?

Existe-t-il un moyen en 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

1 votes

0 votes

Obtenir l'objet appelant : stackoverflow.com/questions/2703136/

5 votes

Il ne s'agit pas d'un doublon de "Get the name of the currently executed method in Ruby". Cette question demande le nom de la méthode appelante, pas le nom de la méthode en cours.

237voto

DigitalRoss Points 80400
puts caller[0]

ou peut-être...

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

5 votes

11 votes

Cela donne le nom de la méthode appelante, mais cela ne donne aucune indication sur le module ou la classe auquel la méthode appartient. Est-ce possible ?

1 votes

@thomthom Oui, c'est possible, vous pouvez appeler self.class.name pour voir le nom de la classe.

188voto

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'en aurai le temps (ou une demande de retrait !).

0 votes

Il convient de noter que cette fonction n'est pas disponible dans Rubinius.

1 votes

Si vous utilisez pry, vous devez ignorer le stacktrace de pry... il ne semble pas y avoir de solution par défaut pour cela.

9 votes

Maintenant, il semble être caller_locations[0].label sur Ruby 2.2.0 sinon vous avez toujours send_action résultat

40voto

Dorian Points 2384

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

Editar : Ma réponse était de dire d'utiliser __method__ mais j'avais tort, il renvoie le nom de la méthode courante.

1 votes

@OswaldoFerreira Merci, je l'ai trouvé sur SO dans une autre réponse quelque part.

5 votes

C'est incorrect, cela renvoie la méthode courante, et non la méthode qui a appelé la méthode courante...

1 votes

Fonctionne comme un charme. Il semble également être beaucoup plus rapide que les méthodes antérieures à la version 2.0.

21voto

Héctor García Points 603

J'utilise

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

4 votes

Quel est l'avantage de cette approche par rapport à celle de DigitalRoss ?

2 votes

Plus propre et plus précis. Plutôt que d'effectuer la recherche, puis d'utiliser une méthode de tableau pour séparer les caractères indésirables en fonction de leur position (ce qui peut être incorrect).

2 votes

Pourquoi ne pas utiliser simplement caller[0][/`(.*)'/, 1] ? Je ne suis pas un gourou des expressions régulières, mais cela semble fonctionner.

4voto

thrice801 Points 732

Qu'en est-il

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

Beaucoup plus propre, je pense.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X