如何获得调用方法的名称?

有没有办法在Ruby中find方法内的调用方法名称?

例如:

class Test def self.foo Fooz.bar end end class Fooz def self.bar # get Test.foo or foo end end 
 puts caller[0] 

也许…

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

在Ruby 2.0.0中,你可以使用:

 caller_locations(1,1)[0].label 

它比Ruby 1.8+解决scheme快得多 :

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

当我得到时间(或拉请求!)将被包括在backports

我用

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

使用caller_locations(1,1)[0].label对于ruby> = 2.0)

编辑 :我的答案是说使用__method__但我错了,它返回当前的方法名称,看到这个要点 。

怎么样

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

更清洁imo。

为了以任何语言查看调用者和被调用者的信息,无论是ruby还是java或python,总是需要查看堆栈跟踪。 在某些语言中,比如Rust和C ++,在编译器中内置了一些选项来打开某种在运行时可以查看的概要分析机制。 我相信ruby存在一个名为ruby-prof。

如上所述,您可以查看执行堆栈的ruby。 这个执行堆栈是一个包含回溯位置对象的数组。

基本上所有你需要知道的这个命令如下:

调用者(start = 1,length = nil)→array或nil

相反,您可以将其编写为库函数,并在需要的地方拨打电话。 代码如下:

 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 

要触发上面的模块方法,你需要像这样caller = CallChain.caller_methodcaller = CallChain.caller_method

代码参考