我知道类方法告诉对象类的名称是什么,我怎么知道调用方法的名字?有没有办法知道这个?
答案 0 :(得分:10)
答案 1 :(得分:3)
调用者是一种kernal方法,可以让你这样做,所以调用者[0]会让你知道函数的直接调用者。
快速入侵只能得到该函数的名称
caller[0][/`\S+/].chop[1..-1]
这会将调用方法的名称作为String返回,然后您可以根据需要使用
答案 2 :(得分:1)
Kernel#caller
完成了String
的{{1}}实现。如果您想进行更复杂的调用堆栈分析,请查看此博客文章:
http://eigenclass.org/hiki/ruby+backtrace+data
作者通过两个不同的更好的调用堆栈对象图实现,一个用纯Ruby实现(不广为人知的)Kernel#set_trace_func
方法,另一个用作MRI的C扩展。
生产应用程序不应使用Ruby附带的Kernel#caller
实现之外的任何其他内容。如果你广泛使用上面的扩展,你可能最终会杀死Ruby有效垃圾收集的能力,并使你的进程(我估计)减慢到几个数量级。
答案 3 :(得分:0)
你可以这样写:
module Kernel
private
def who_is_calling? # Or maybe def who_just_called?
caller[1] =~ /`([^']*)'/ and $1
end
end
然后你有这些小测试:
irb(main):056:0* def this_is_a_method
irb(main):057:1> puts "I, 'this_is_a_method', was called upon by: '#{who_is_calling?}'"
irb(main):058:1> end
=> nil
irb(main):059:0> def this_is_a_method_that_calls_another
irb(main):060:1> this_is_a_method
irb(main):061:1> end
=> nil
irb(main):062:0> this_is_a_method_that_calls_another
I, 'this_is_a_method', was called upon by: 'this_is_a_method_that_calls_another'
=> nil
irb(main):063:0> this_is_a_method
I, 'this_is_a_method', was called upon by: 'irb_binding'
=> nil
irb(main):064:0>