2010-04-07 3 views
3

Сейчас мой код работает так:Как вернуть имя имени метода вызова?

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 

Вместо method_b печати «method_b», как я могу напечатать имя метода вызова - «method_a»?

ответ

3

Когда вы находитесь в name_of_calling_method вызывается из method_b затем method_a 1 записи выше стеки вызовов, так что вы хотите caller[1] в name_of_calling_method, а не caller.first или caller[0].

Поскольку вы положили регулярное выражение на левой стороне и индекс в caller на право вам не нужно будет дополнительно nil чек для случая, когда method_b называется непосредственно и caller[1] является nil - ваш нет матчelse кейс будет покрывать его.