कॉलिंग विधि का नाम कैसे प्राप्त करें?


161

क्या रूबी में एक तरीका है कि किसी विधि के अंदर कॉलिंग मेथड का नाम खोजा जाए?

उदाहरण के लिए:

class Test
  def self.foo
    Fooz.bar
  end
end

class Fooz
  def self.bar
    # get Test.foo or foo
  end
end


कॉलिंग ऑब्जेक्ट प्राप्त करें: stackoverflow.com/questions/2703136/…
Ciro Santilli 郝海东 over over over

"रूबी में वर्तमान में निष्पादित पद्धति का नाम प्राप्त करें" का डुप्लिकेट नहीं। यह प्रश्न कॉलिंग विधि के नाम से पूछता है, वर्तमान पद्धति के नाम से नहीं।
वेन कॉनराड

जवाबों:


210
puts caller[0]

या शायद...

puts caller[0][/`.*'/][1..-2]

5
हाँ, कर्नेल # फोन करने वाले को देखने के, उर्फ ruby-doc.org/core-1.8.7/classes/Kernel.html#M001073
DigitalRoss

10
यह कॉलिंग विधि का नाम देता है, लेकिन यह इस बात का कोई संकेत नहीं देता है कि यह विधि किस मॉड्यूल या वर्ग से संबंधित है। क्या यह संभव है?
थोमथोम

@thomthom हाँ यह संभव है कि आप self.class.name को कॉल कर सकते हैं
Thorin

स्ट्रिंग सूचकांक के रूप में रेगेक्स का उत्कृष्ट उपयोग! का उपयोग भी कर सकते हैंcaller[0][/`(.*)'/,1]
aks

1
यह रेल 5.2.1 में काम नहीं करता है। रेल नियंत्रक में यह रिटर्न देता है "block in make_lambda"। मुझे लगता है कि यह केवल रूबी के लिए है।
dcangulo

164

रूबी 2.0.0 में, आप उपयोग कर सकते हैं:

caller_locations(1,1)[0].label

यह रूबी 1.8+ समाधान से बहुत तेज है:

caller[0][/`([^']*)'/, 1]

में शामिल हो जाएगा backports, जब मैं समय मिलता है (या एक पुल अनुरोध!)।


यह ध्यान देने योग्य है कि यह रुबिनियस में उपलब्ध नहीं है।
अधिकतम

1
अगर आप pry का उपयोग कर रहे हैं, तो आपको लगता है कि pry स्टैकट्रेस को अनदेखा करना होगा ... इसके लिए कोई डिफ़ॉल्ट समाधान नहीं लगता है।
dtc

6
अब यह caller_locations[0].labelरूबी 2.2.0 पर लगता है अन्यथा आपके पास हमेशा send_actionपरिणाम होता है
brcebn

1
हम केवल कॉल ऐप विधि कैसे प्राप्त कर सकते हैं और फ्रेमवर्क कॉल को अनदेखा कर सकते हैं?
मैट्रिक्स

31

उपयोग caller_locations(1,1)[0].label(रूबी के लिए = = 2.0)

संपादित करें : मेरा उत्तर उपयोग करने के लिए कह __method__रहा था लेकिन मैं गलत था, यह वर्तमान विधि का नाम देता है।


1
@OswaldoFerreira धन्यवाद, इसे SO पर कहीं और एक उत्तर में मिला
डोरियन

5
यह गलत है, यह वर्तमान पद्धति को लौटाता है, उस विधि को नहीं जिसे वर्तमान विधि कहा जाता है ...
thrice801

1
एक जादू की तरह काम करता है। यह भी पूर्व 2.0 तरीकों की तुलना में बहुत तेज लगता है।
Dr.Strangelove

21

मैं उपयोग करता हूं

caller[0][/`([^']*)'/, 1]

4
DigitalRoss के इस दृष्टिकोण का क्या लाभ है?
एंड्रयू ग्रिम

2
क्लीनर और अधिक सटीक। खोज करने के बजाय, फिर स्थिति के आधार पर अवांछित वर्णों को विभाजित करने के लिए एक सरणी विधि का उपयोग करना (जो गलत हो सकता है)।
न्यू अलेक्जेंड्रिया

2
बस कॉलर का उपयोग क्यों न करें [0] [/ `(। *) '/, 1]? मैं नियमित अभिव्यक्ति के बारे में गुरु नहीं हूँ, लेकिन यह काम करने लगता है।
कोलिमार्को

7
@collimarco जब तक स्ट्रिंग में वह नहीं होता 'है जिसे आप ढूंढ रहे हैं (और मुझे लगता है कि यह नहीं है), परिणाम समान होगा, निश्चित है। हालाँकि, [^']*बेहतर प्रदर्शन करेगा क्योंकि रेगेक्स इंजन उस हिस्से से मेल खाने की कोशिश करना बंद कर देगा, जो उस क्षण पहुंचता है '(आपका संस्करण अंत तक जाएगा, फिर बैकट्रैक क्योंकि यह 'अंत में नहीं मिला )। अंतर बेशक इस मामले में बहुत नगण्य है, लेकिन .जहाँ संभव हो वहाँ regexes से बचना एक अच्छी आदत है।
Thor84no

4

कैसा रहेगा

caller[0].split("`").pop.gsub("'", "")

बहुत क्लीनर imo।


3

इसके बजाय आप इसे लाइब्रेरी फ़ंक्शन के रूप में लिख सकते हैं और जहां भी आवश्यकता हो कॉल कर सकते हैं। कोड निम्नानुसार है:

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

से कोड संदर्भ


1
संभावित समाधान का लिंक हमेशा स्वागत योग्य है, लेकिन कृपया लिंक के चारों ओर संदर्भ जोड़ें , ताकि आपके साथी उपयोगकर्ताओं को कुछ पता चले कि यह क्या है और यह क्यों है। हमेशा एक महत्वपूर्ण लिंक का सबसे प्रासंगिक हिस्सा उद्धृत करें, यदि लक्ष्य साइट उपलब्ध नहीं है या स्थायी रूप से ऑफ़लाइन है। इस बात का ध्यान रखें कि किसी बाहरी साइट के लिंक से मुश्किल से अधिक होना एक संभावित कारण है कि कुछ उत्तरों को क्यों और कैसे हटाया जाता है?
जेवी लोपेज़

@ XaviLópez ने उत्तर को अद्यतन किया है, यदि कोई गलत काम कर रहा है या गलत कर रहा है तो plz सुधारें ...
थोड़े

1
अपना उत्तर सुधारने के लिए धन्यवाद। दुर्भाग्य से, मुझे इस पोस्ट के बारे में ठीक से टिप्पणी करने में सक्षम होने के लिए रूबी के बारे में पर्याप्त ज्ञान नहीं है, लेकिन जवाब अब ठीक लग रहा है। मैंने अपना डाउनवोट हटा दिया है। शुभकामनाएँ :-)
Xavi लोपेज़

2

किसी भी भाषा में कॉलर और कैली की जानकारी देखने के लिए, चाहे वह रूबी हो या जावा या अजगर, आप हमेशा स्टैक ट्रेस को देखना चाहेंगे। कुछ भाषाओं में, जैसे कि रस्ट और C ++, संकलक में निर्मित विकल्प हैं जो किसी प्रकार के प्रोफाइलिंग तंत्र को चालू करने के लिए आप रन टाइम के दौरान देख सकते हैं। मुझे लगता है कि रूबी को माणिक-प्रोफ कहा जाता है।

और जैसा कि ऊपर उल्लेख किया गया है, आप रूबी के लिए निष्पादन स्टैक में देख सकते हैं। यह निष्पादन स्टैक एक सरणी है जिसमें बैकट्रेस स्थान ऑब्जेक्ट हैं।

इस कमांड के बारे में जानने के लिए आवश्यक रूप से आप इस प्रकार हैं:

कॉलर (प्रारंभ = 1, लंबाई = शून्य) → सरणी या शून्य

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.