2010-04-07 11 views
3

En ce moment, mon code fonctionne en tant que tel:Comment retourner le nom de chaîne de la méthode d'appel?

def method_a 
    self.method_b ==> 'method_b' 
end 

def method_b 
    puts self.name_of_calling_method 
end 

def name_of_calling_method 
    if /`(.*)'/.match(caller.first) 
    return $1 
    else 
    return nil 
    end 
end 

au lieu d'imprimer de method_b « de method_b », comment puis-je imprimer le nom de la méthode d'appel - « method_a »?

Répondre

2

Remplacez caller.first par caller[1].

3

Lorsque vous êtes appelé name_of_calling_method de method_b alors method_a est une entrée plus haut dans la pile d'appel de sorte que vous voulez caller[1] dans name_of_calling_method plutôt que caller.first ou caller[0].

Parce que vous avez mis la regexp sur le côté gauche et l'index dans caller sur la droite, vous aurez pas besoin d'un contrôle supplémentaire nil pour le cas où method_b est appelé directement et caller[1] est nil - votre pas matchelse cas couvrira.