$0 शीर्ष स्तर रूबी कार्यक्रम के लिए चर है, लेकिन क्या वर्तमान पद्धति के लिए एक है?
$0 शीर्ष स्तर रूबी कार्यक्रम के लिए चर है, लेकिन क्या वर्तमान पद्धति के लिए एक है?
जवाबों:
मेरे पहले उत्तर से भी बेहतर आप __method__ का उपयोग कर सकते हैं:
class Foo
def test_method
__method__
end
end
यह एक प्रतीक देता है - उदाहरण के लिए :test_method,। स्ट्रिंग के रूप में विधि नाम वापस करने के लिए, __method__.to_sइसके बजाय कॉल करें ।
नोट: इसके लिए रूबी 1.8.7 की आवश्यकता है।
__method__.to_sऔर यह विधि का नाम होगा, और कुछ नहीं
से 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
__callee__यह नहीं करता है ?
वास्तव में आप जो चाहते हैं उसके आधार पर, आप __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}}
रूबी 1.9+ के लिए मैं उपयोग करने की सलाह दूंगा __callee__
__callee__1.9 से पहले अलग तरह से व्यवहार करता है, इसलिए यह सबसे अच्छा है __method__क्योंकि यह लगातार व्यवहार करता है। 1.9 के बाद के __callee__रूप में ही व्यवहार करता है __method__।
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क्या आपको कुछ अजीब नहीं दिख रहा है?
__callee__और __method__अलग व्यवहार है। Pastie.org/10380985 (रूबी 2.1.5) देखें
मुझे दृश्य फ़ाइल में विधि का नाम पुनर्प्राप्त करने के लिए एक ही मुद्दा मिला है। मुझे इसका हल मिल गया
params[:action] # it will return method's name
यदि आप नियंत्रक का नाम प्राप्त करना चाहते हैं तो
params[:controller] # it will return you controller's name
superकर रहा है एक SimpleDelegator वस्तु के भीतर बुलाया जा सकता है:def description; __getobj__.respond_to?(__method__) ? super : 'No description'; end