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
8条答案
按热度按时间vjhs03f71#
或者...
bwitn5fc2#
在Ruby 2.0.0中,你可以用途:
它比Ruby 1.8+解决方案快得多:
当我得到时间(或一个pull请求!)时,将包含在
backports
中。ubby3x7f3#
使用
caller_locations(1,1)[0].label
(对于ruby〉= 2.0)编辑:我的答案是使用
__method__
,但我错了,它返回当前方法名称。lb3vh1jj4#
我用
qyswt5oh5#
不如
更干净的海事组织。
dkqlctbz6#
相反,你可以把它写成库函数,在需要的地方调用它。代码如下:
要触发上面的模块方法,你需要像这样调用:
caller = CallChain.caller_method
code reference from
44u64gxh7#
为了在任何语言中查看调用者和被调用者的信息,无论是ruby、java还是python,你总是希望查看堆栈跟踪。在一些语言中,如Rust和C++,编译器中内置了一些选项,可以打开某种可以在运行时查看的分析机制。我相信Ruby中存在一个名为ruby-prof的机制。
如上所述,你可以查看ruby的执行堆栈,这个执行堆栈是一个包含回溯位置对象的数组。
基本上,您需要了解的关于此命令的所有内容如下:
caller(start=1,length=nil)→ array或nil
kcwpcxri8#
来自@amitkarsale的答案是可行的,但是
private
在模块中不做任何事情,因为模块没有被示例化。下面是call_chain.rb
,根据Rubocop的建议重写: