我知道類方法告訴什麼是對象類的名稱,我怎麼知道調用方法的名稱?有什麼方法可以知道嗎?有沒有辦法知道調用方法?
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