有没有办法知道调用方法?

时间:2009-12-07 13:27:38

标签: ruby callstack

我知道类方法告诉对象类的名称是什么,我怎么知道调用方法的名字?有没有办法知道这个?

4 个答案:

答案 0 :(得分:10)

Examining the Ruby Call Stack分享此信息:

您是否曾想查看调用堆栈而不提出异常来执行此操作?

caller.each {|c| puts c}

答案 1 :(得分:3)

调用者是一种kernal方法,可以让你这样做,所以调用者[0]会让你知道函数的直接调用者。

快速入侵只能得到该函数的名称

caller[0][/`\S+/].chop[1..-1]

这会将调用方法的名称作为String返回,然后您可以根据需要使用

答案 2 :(得分:1)

为了性能和垃圾收集的原因,Ruby使用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>