2013-04-26 2 views

उत्तर

20

नहीं, रुबी स्वचालित रूप से initialize पर कॉल नहीं करता है।

Class#new के डिफ़ॉल्ट कार्यान्वयन लग रहा है इस तरह एक सा:

class Class 
    def new(*args, &block) 
    obj = allocate 
    obj.initialize(*args, &block) 
    obj 
    end 
end 

[असल में, initializeprivate डिफ़ॉल्ट रूप से तो आप obj.send(:initialize, *args, &block) उपयोग करने की आवश्यकता है।]

तो, Class#newके डिफ़ॉल्ट कार्यान्वयन कॉल initialize पर कॉल करता है, लेकिन यह एक कार्यान्वयन के साथ ओवरराइड या ओवरराइट करने के लिए पूरी तरह से संभव है (हालांकि बेहद बेवकूफ)।

तो, यह रूबी नहीं है जो initialize पर कॉल करता है, यह Class#new है। आपको लगता है कि यह विभाजित बाल है, क्योंकि Class#new रूबी का एक अभिन्न अंग है, लेकिन यहां महत्वपूर्ण बात यह है कि यह किसी प्रकार का भाषा जादू नहीं है। यह किसी अन्य की तरह एक विधि है, और किसी भी अन्य विधि की तरह इसे ओवरराइड किया जा सकता है या कुछ अलग करने के लिए ओवरराइट किया जा सकता है।

और, यदि आप ऑब्जेक्ट बनाने के लिए new का उपयोग नहीं करते हैं, लेकिन इसके बजाय इसे allocate के साथ मैन्युअल रूप से करें, तो initialize को भी नहीं कहा जाएगा।

कुछ मामले हैं जहां ऑब्जेक्ट initialize पर कॉल किए बिना बनाए जाते हैं। जैसे जब dup आईएनजी या clone आईएनजी, initialize_dup और initialize_cloneinitialize (बदले में, initialize_copy पर कॉल करें) के बजाय बुलाए जाते हैं। और जब किसी ऑब्जेक्ट को deserializing, कहते हैं, Marshal, इसकी आंतरिक स्थिति सीधे पुनर्निर्मित की जाती है (यानी उदाहरण चर के प्रतिबिंबित रूप से सेट होते हैं) initialize के माध्यम से।

+0

क्या आप यह उल्लेख करना चाहते हैं कि व्युत्पन्न वर्ग अपने माता-पिता के 'प्रारंभिक' के साथ कैसे इंटरैक्ट करता है? –

+0

@ जॉर्ज 'ओवरराइट' से आपका क्या मतलब है? क्या आप इसे थोड़ा सा स्पष्ट कर सकते हैं? –

+0

@ प्रिती: रुबी ने तथाकथित * खुले वर्ग * को बुलाया है, यह आपको एक नए तरीके के साथ एक मौजूदा विधि को ओवरराइट करने की अनुमति देता है। –

1

हां, इसे new विधि से कहा जाता है, जिसका उपयोग आप वस्तुओं को बनाने के लिए करते हैं।

1

यह "स्पष्ट" की आपकी परिभाषा पर निर्भर करता है। अंतर्निहित आरंभीकरण का एक रूप बनाने

object = MyClass.new(...) 

कुछ मामलों वहाँ कारखाने तरीकों कि उदाहरणों आप उपयोग कर सकते हैं उत्पादन कर रहे हैं में,:: आमतौर पर आप भले ही कोई तर्क हैं, की जरूरत है

object = MyClass.factory_method(...) 

यह होता है आंतरिक रूप से MyObject.new पर कॉल करने का प्रभाव।

object = MyClass(...) 
object = MyClass[...] 

प्रभाव ही है, इन अजीब लग रही है लेकिन अभी विधि कॉल कर रहे हैं हो सकता है के रूप में:

कुछ पुस्तकालयों जो बल्कि असामान्य विधि हस्ताक्षर है, की तरह हैं।

संबंधित मुद्दे