我知道类方法告诉什么是对象类的名称,我怎么知道调用方法的名称?有什么方法可以知道吗?有没有办法知道调用方法?
6
A
回答
10
3
呼叫者是籽粒方法,可以让你做到这一点,所以呼叫者[0]会让你知道函数的直接调用方。
快速黑客只得到函数的名称可能是
caller[0][/`\S+/].chop[1..-1]
这将返回调用方法的名字作为一个字符串,然后你就可以,但是你想
1
使用Ruby的为了性能和垃圾收集的原因,使用String
完成了Kernel#caller
的实现。如果你想要做更复杂的调用堆栈分析,看看这个博客帖子:
http://eigenclass.org/hiki/ruby+backtrace+data
笔者经过一个更好的调用栈对象图的两种不同的实现,一个在纯Ruby与实现(未广为人知)Kernel#set_trace_func
方法,另一个作为MRI的C扩展。
生产应用程序不应该使用Ruby自带的Kernel#caller
实现以外的任何其他应用程序。如果你广泛地使用扩展,你可能会最终杀死Ruby有效地进行垃圾收集,并使你的过程变慢(我估计)达到几个数量级。
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>
相关问题
- 1. 有没有办法知道一个对象的C#方法是否被调用?
- 2. freemarker:有没有办法让我知道调用url?
- 3. 有没有办法知道在Perl中的未知类的实例的方法
- 4. 有没有办法从友好方面知道原始URL?
- 5. iPhone - 有没有办法知道引用是否(仍然)有效?
- 6. 有没有办法知道自定义通知即将显示?
- 7. VBA中有没有办法知道未使用的变量?
- 8. 有没有办法知道会话使用多少内存?
- 9. 有没有办法知道用户是否发送了短信?
- 10. 有没有办法知道Data Saver是否启用?
- 11. 有没有办法知道异常是否被禁用?
- 12. 有没有办法知道用户是否打开邮件?
- 13. 有没有办法知道应用程序第一次启动?
- 14. 有没有办法通过实例方法知道类名?红宝石
- 15. 有没有办法知道方法webViewDidFinishLoad:哪个网址被加载?
- 16. 有没有办法知道一个方法需要多少个参数?
- 17. 有没有办法在可调用方法中使用参数?
- 18. 有没有办法知道当前有多少个webrole实例?
- 19. 有没有办法知道,只有数据
- 20. 有没有办法知道,当有人导入附加的vCard?
- 21. 有没有办法知道nodeunit已经完成所有测试?
- 22. 有没有办法知道手机是否有通话?
- 23. 有没有办法知道某个事件正在调用哪个函数?
- 24. 有没有办法知道从外部DLL调用了哪些函数?
- 25. 有没有办法从Asp.net MVC4 controllder中调用Silverlight方法?
- 26. 有没有办法在eval中调用类方法?
- 27. 有没有办法从网页上调用HTTPModule的方法?
- 28. 有没有办法避免方法调用重复?
- 29. 有没有办法强制调用重写的方法?
- 30. 有没有办法从ExternalInterface调用Javascript类方法?
不,这不是一个有效的问题,所有的,但不必查看来电堆栈通常意味着你做错了什么。 – 2009-12-07 13:35:31