क्या रूबी में एक तरीका है कि किसी विधि के अंदर कॉलिंग मेथड का नाम खोजा जाए?
उदाहरण के लिए:
class Test
def self.foo
Fooz.bar
end
end
class Fooz
def self.bar
# get Test.foo or foo
end
end
क्या रूबी में एक तरीका है कि किसी विधि के अंदर कॉलिंग मेथड का नाम खोजा जाए?
उदाहरण के लिए:
class Test
def self.foo
Fooz.bar
end
end
class Fooz
def self.bar
# get Test.foo or foo
end
end
जवाबों:
puts caller[0]
या शायद...
puts caller[0][/`.*'/][1..-2]
caller[0][/`(.*)'/,1]
"block in make_lambda"। मुझे लगता है कि यह केवल रूबी के लिए है।
रूबी 2.0.0 में, आप उपयोग कर सकते हैं:
caller_locations(1,1)[0].label
यह रूबी 1.8+ समाधान से बहुत तेज है:
caller[0][/`([^']*)'/, 1]
में शामिल हो जाएगा backports, जब मैं समय मिलता है (या एक पुल अनुरोध!)।
caller_locations[0].labelरूबी 2.2.0 पर लगता है अन्यथा आपके पास हमेशा send_actionपरिणाम होता है
उपयोग caller_locations(1,1)[0].label(रूबी के लिए = = 2.0)
संपादित करें : मेरा उत्तर उपयोग करने के लिए कह __method__रहा था लेकिन मैं गलत था, यह वर्तमान विधि का नाम देता है।
मैं उपयोग करता हूं
caller[0][/`([^']*)'/, 1]
'है जिसे आप ढूंढ रहे हैं (और मुझे लगता है कि यह नहीं है), परिणाम समान होगा, निश्चित है। हालाँकि, [^']*बेहतर प्रदर्शन करेगा क्योंकि रेगेक्स इंजन उस हिस्से से मेल खाने की कोशिश करना बंद कर देगा, जो उस क्षण पहुंचता है '(आपका संस्करण अंत तक जाएगा, फिर बैकट्रैक क्योंकि यह 'अंत में नहीं मिला )। अंतर बेशक इस मामले में बहुत नगण्य है, लेकिन .जहाँ संभव हो वहाँ regexes से बचना एक अच्छी आदत है।
इसके बजाय आप इसे लाइब्रेरी फ़ंक्शन के रूप में लिख सकते हैं और जहां भी आवश्यकता हो कॉल कर सकते हैं। कोड निम्नानुसार है:
module CallChain
def self.caller_method(depth=1)
parse_caller(caller(depth+1).first).last
end
private
# Copied from ActionMailer
def self.parse_caller(at)
if /^(.+?):(\d+)(?::in `(.*)')?/ =~ at
file = Regexp.last_match[1]
line = Regexp.last_match[2].to_i
method = Regexp.last_match[3]
[file, line, method]
end
end
end
उपरोक्त मॉड्यूल विधि को ट्रिगर करने के लिए आपको इस तरह से कॉल करने की आवश्यकता है:
caller = CallChain.caller_method
किसी भी भाषा में कॉलर और कैली की जानकारी देखने के लिए, चाहे वह रूबी हो या जावा या अजगर, आप हमेशा स्टैक ट्रेस को देखना चाहेंगे। कुछ भाषाओं में, जैसे कि रस्ट और C ++, संकलक में निर्मित विकल्प हैं जो किसी प्रकार के प्रोफाइलिंग तंत्र को चालू करने के लिए आप रन टाइम के दौरान देख सकते हैं। मुझे लगता है कि रूबी को माणिक-प्रोफ कहा जाता है।
और जैसा कि ऊपर उल्लेख किया गया है, आप रूबी के लिए निष्पादन स्टैक में देख सकते हैं। यह निष्पादन स्टैक एक सरणी है जिसमें बैकट्रेस स्थान ऑब्जेक्ट हैं।
इस कमांड के बारे में जानने के लिए आवश्यक रूप से आप इस प्रकार हैं:
कॉलर (प्रारंभ = 1, लंबाई = शून्य) → सरणी या शून्य