2009-12-07 24 views
6

मुझे पता है कि कक्षा विधि बताती है कि किसी ऑब्जेक्ट के वर्ग का नाम क्या है, मैं invoking विधि का नाम कैसे जान सकता हूं? क्या यह जानने का कोई तरीका है?क्या आविष्कार विधि जानने का कोई तरीका है?

+4

ढेर आमतौर पर मतलब है कि आप कुछ गलत कर रहे हैं। –

उत्तर

10

Examining the Ruby Call Stack शेयरों इस जानकारी:

क्या तुमने कभी यह करने के लिए एक अपवाद को ऊपर उठाने के बिना कॉल स्टैक को देखने के लिए करना चाहता था है?

caller.each {|c| puts c} 
3

फोन करने वाले एक kernal विधि आप यह कर देता है कि, तो फोन करने वाले [0] आप समारोह के तत्काल फोन करने वाले को पता चल जाएगा है।

पाने के लिए एक त्वरित हैक केवल फ़ंक्शन का नाम हो सकता है

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

यह एक स्ट्रिंग है, जो आप तो फिर भी आप

1

चाहते का उपयोग कर सकते रूबी के रूप में बुला विधि का नाम वापस आ जाएगी Kernel#caller का कार्यान्वयन प्रदर्शन और कचरा संग्रहण कारणों के लिए String एस के साथ किया गया था। आप और अधिक परिष्कृत कॉल स्टैक विश्लेषण करना चाहते हैं, इस ब्लॉग पोस्ट पर एक नज़र डालें:

http://eigenclass.org/hiki/ruby+backtrace+data

लेखक एक बेहतर कॉल स्टैक वस्तु ग्राफ के दो विभिन्न कार्यान्वयन, एक के साथ शुद्ध रूबी में लागू माध्यम से चला जाता (व्यापक रूप से ज्ञात नहीं) Kernel#set_trace_func विधि और दूसरा जो एमआरआई के लिए सी एक्सटेंशन के रूप में काम करता है।

एक उत्पादन अनुप्रयोग को रूबी के साथ आने वाले Kernel#caller कार्यान्वयन के अलावा कुछ भी उपयोग नहीं करना चाहिए। यदि आप बड़े पैमाने पर विस्तार का उपयोग करते हैं तो आप शायद रूबी की क्षमता को प्रभावी रूप से एकत्रित करने की क्षमता को खत्म कर देंगे और परिमाण के कई आदेशों तक आपकी प्रक्रिया (अनुमान लगाएं) धीमा कर देंगे।

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> 
ऐसा नहीं है कि यह एक वैध सवाल और सभी, लेकिन कॉल को देखने के लिए नहीं होने है
संबंधित मुद्दे

 संबंधित मुद्दे