वर्तमान में निष्पादित विधि का नाम प्राप्त करें


198

$0 शीर्ष स्तर रूबी कार्यक्रम के लिए चर है, लेकिन क्या वर्तमान पद्धति के लिए एक है?


एक प्रयोग की जाँच superकर रहा है एक SimpleDelegator वस्तु के भीतर बुलाया जा सकता है:def description; __getobj__.respond_to?(__method__) ? super : 'No description'; end
क्रि

जवाबों:


334

मेरे पहले उत्तर से भी बेहतर आप __method__ का उपयोग कर सकते हैं:

class Foo
  def test_method
    __method__
  end
end

यह एक प्रतीक देता है - उदाहरण के लिए :test_method,। स्ट्रिंग के रूप में विधि नाम वापस करने के लिए, __method__.to_sइसके बजाय कॉल करें ।

नोट: इसके लिए रूबी 1.8.7 की आवश्यकता है।


11
':' सिर्फ प्रतीक का प्रतीक है। :) बस करो __method__.to_sऔर यह विधि का नाम होगा, और कुछ नहीं
लैम्बर्ट

यदि मैं रेक कार्य में हूँ तो क्या होगा?
इमरान अहमद

24

से http://snippets.dzone.com/posts/show/2785 :

module Kernel
private
    def this_method_name
      caller[0] =~ /`([^']*)'/ and $1
    end
end

class Foo
  def test_method
    this_method_name
  end
end

puts Foo.new.test_method    # => test_method

5
यह मुझे कॉलिंग का नाम (वर्तमान के विपरीत) विधि खोजने के लिए बहुत मददगार था ।
लैंबार्ट

__callee__यह नहीं करता है ?
जोशुआ पिंटर

महान समाधान मार्क अब तक का सबसे अच्छा समाधान। महान काम
jonathanccalixto

18

वास्तव में आप जो चाहते हैं उसके आधार पर, आप __method__या तो उपयोग कर सकते हैं या __callee__, जो वर्तमान में निष्पादित विधि का नाम एक प्रतीक के रूप में वापस करते हैं।

माणिक 1.9 पर, वे दोनों पहचान के रूप में व्यवहार करते हैं (जहाँ तक डॉक्स और मेरे परीक्षण का संबंध है)।

__callee__यदि आप परिभाषित विधि का एक उपनाम कहते हैं तो रूबी 2.1 और 2.2 अलग तरह से व्यवहार करता है। डॉक्स दो के लिए अलग कर रहे हैं:

  • __method__: "वर्तमान पद्धति की परिभाषा में नाम" (अर्थात जैसा कि परिभाषित किया गया था)
  • __callee__: "वर्तमान पद्धति का तथाकथित नाम" (अर्थात जैसा कहा गया था वैसा नाम)

टेस्ट स्क्रिप्ट:

require 'pp'
puts RUBY_VERSION
class Foo
  def orig
    {callee: __callee__, method: __method__}
  end
  alias_method :myalias, :orig
end
pp( {call_orig: Foo.new.orig, call_alias: Foo.new.myalias} )

1.9.3 आउटपुट:

1.9.3
{:call_orig=>{:callee=>:orig, :method=>:orig},
 :call_alias=>{:callee=>:orig, :method=>:orig}}

2.1.2 आउटपुट ( __callee__अलियास किए गए नाम को __method__लौटाता है , लेकिन जिस विधि को परिभाषित किया गया था उस बिंदु पर नाम लौटाता है):

2.1.2
{:call_orig=>{:callee=>:orig, :method=>:orig},
 :call_alias=>{:callee=>:myalias, :method=>:orig}}

10

रूबी 1.9+ के लिए मैं उपयोग करने की सलाह दूंगा __callee__


3
__callee__1.9 से पहले अलग तरह से व्यवहार करता है, इसलिए यह सबसे अच्छा है __method__क्योंकि यह लगातार व्यवहार करता है। 1.9 के बाद के __callee__रूप में ही व्यवहार करता है __method__
लेई मेक्कलोच

@LeighMcCulloch क्या आप एक उदाहरण के साथ अंतर की व्याख्या कर सकते हैं (संभवतः एक नए उत्तर में)?
सिरो सेंटिल्ली 郝海东 i iro i 法轮功 ''

@CiroSantilli 六四 事件 ill 威 视 you def m1() puts("here is #{__method__} method. My caller is #{__callee__}.") end; def m2() puts("here is #{__method__} method. Let's call m1"); m1 end; m2क्या आपको कुछ अजीब नहीं दिख रहा है?
jgburet

4
@LeighMcCulloch वास्तव में अब __callee__और __method__अलग व्यवहार है। Pastie.org/10380985 (रूबी 2.1.5) देखें
goodniceweb

1
pastie.org नीचे है। हमेशा के लिए या अभी?
नैकिलोन

-3

मुझे दृश्य फ़ाइल में विधि का नाम पुनर्प्राप्त करने के लिए एक ही मुद्दा मिला है। मुझे इसका हल मिल गया

params[:action] # it will return method's name

यदि आप नियंत्रक का नाम प्राप्त करना चाहते हैं तो

params[:controller] # it will return you controller's name

4
मुझे लगता है कि आपने रेल नियंत्रक क्रियाओं और http तरीकों के बारे में प्रश्न का गलत अर्थ निकाला है ... यह उत्तर शायद हटा दिया जाना चाहिए।
फैक्टर मिस्टिक

दृश्य से वर्तमान में निष्पादित (नियंत्रक) विधि का नाम प्राप्त करने के लिए उपयोगी है।
१०:५० पर एवजार्सवेल्ड जूल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.