आप वास्तव में नहीं बता सकता।
किसी विधि तक पहुंच प्राप्त करने का एकमात्र तरीका #method
संदेश को किसी ऑब्जेक्ट को भेजना है, जो तब Method
ऑब्जेक्ट लौटाएगा। लेकिन क्या Method
विधि को ऑब्जेक्ट कर रहा है? या यह विधि के चारों ओर एक रैपर है? या यह मूल विधि का एक परिवर्तित संस्करण है?
आप नहीं जान सकते: यदि आप किसी विधि को देखना चाहते हैं, तो आपको #method
पर कॉल करना होगा, जिस बिंदु पर आप निश्चित रूप से ऑब्जेक्ट प्राप्त करेंगे। से पहले #method
कहा गया था, इसलिए आप नहीं देख सकते हैं, इसलिए आप नहीं बता सकते हैं।
कुछ डेटापॉइंट्स: रुबी में, सब कुछ एक मूल्य देता है। def
क्या करता है? यह हमेशाnil
देता है, Method
ऑब्जेक्ट नहीं। और define_method
? यह Proc
देता है, लेकिन Method
नहीं (न ही UnboundMethod
)। [नोट: रूबिनीस में, def
विधि के संकलित बाइटकोड लौटाता है, लेकिन फिर भी Method
ऑब्जेक्ट नहीं देता है।]
यदि आप रुबी भाषा विशिष्टता की धारा 6.1 के चौथे और 5 वें पैराग्राफ (पेज 5-34 और पेज 5 और 6 पर 1-5) देखते हैं, तो आप स्पष्ट रूप से देख सकते हैं कि विधियों के बीच एक अंतर है और वस्तुओं। और यदि आप बिल्टिन कक्षाओं के विनिर्देश को देखते हैं, तो आप पाएंगे कि न तो Method
और न ही UnboundMethod
वहां हैं, न ही Object#method
है। IOW: आप एक पूरी तरह से मानकों-अनुरूप रूबी दुभाषिया का निर्माण कर सकते हैं जिसमें ऑब्जेक्ट्स नहीं हैं।
अब, OTOH ब्लॉक निश्चित रूप से ऑब्जेक्ट्स नहीं हैं। ऐसे कई तरीके हैं करने के लिए ब्लॉक सेProc
वस्तुओं का निर्माण, जो तब मूल ब्लॉक (lambda
, proc
, Proc.new
, &
sigil) के रूप में ही व्यवहार कर रहे हैं, लेकिन ब्लॉक खुद को ऑब्जेक्ट नहीं है।
इस बारे में सोचें: आप एक फ़ाइल ऑब्जेक्ट बनाने के लिए File.new
पर एक स्ट्रिंग पास कर सकते हैं, लेकिन इससे कोई स्ट्रिंग फ़ाइल नहीं बनती है। आप एक ऑब्जेक्ट बनाने के लिए Proc.new
पर एक ब्लॉक पास कर सकते हैं, लेकिन इससे कोई ब्लॉक ब्लॉक नहीं होता है।
कार्य रूबी में प्रथम श्रेणी के नागरिक हैं और वस्तुओं में परिवर्तित किया जा सकता है, तो चिंता क्यों करें? मुझे लगता है कि उत्तर बहुत समझने के लिए बहुत कम स्तर लगेगा ... –
क्या वे हैं? आईएमएचओ, तथ्य यह है कि आपको उन्हें वस्तुओं में बदलने की ज़रूरत है, उन्हें प्रथम श्रेणी नहीं बनाते हैं। यही वह जवाब है जो मैं जवाब से भी सीखना चाहता हूं। –