2012-02-25 11 views
5

मैं रेल स्रोत कोड का विश्लेषण कर रहा हूं, क्योंकि मैं has_many और इसी तरह की संरचनाओं के आंतरिक कार्यों को समझना चाहता हूं।रेल पर रूबी कितनी है (और इसी तरह) लागू है?

अब तक, मैं जहां विधि कार्यान्वित किया जाता है (link to github) ढूँढने में सक्षम था: यह वर्ग ActiveRecord में मॉड्यूल ActiveRecord :: संघों

def has_many(name, options = {}, &extension) 
    Builder::HasMany.build(self, name, options, &extension) 
end 

यह एक eventualy समाप्त होता है (link to github) में है :: संघों :: बिल्डर :: CollectionAssociation

def self.build(model, name, options, &extension) 
    new(model, name, options, &extension).build 
end 

के रूप में जहाँ मेरे गहरे लाल रंग का कौशल अंत है और मैं इसे आगे ट्रैक नहीं कर सकता है और जहां 'नई' लागू किया तथा उसके द्वारा किया जाता है लगता है नहीं है।

क्या कोई मुझे सही दिशा में इंगित कर सकता है और हो सकता है कि हुड के नीचे क्या हो रहा है?

+4

+1 उपकरण के स्रोत कोड ध्यानपूर्वक पढ़ने के लिए:

class Class def new(*args, &block) obj = allocate obj.initialize(*args, &block) # *actually* obj.send(:initialize, *args, &block) since initialize is private obj end end 

allocate इस तरह परिभाषित किया गया है अपने आंतरिक की गहरी समझ। जाने के लिए रास्ता। –

+1

@ एसएम .: मैं सहमत हूं। यदि स्रोत कोड पढ़ना "अनुसंधान प्रयास नहीं दिखाता है" (जैसा कि अपवॉट बटन के लिए टूलटिप कहता है), मुझे नहीं पता कि क्या करता है! +1! –

+1

उत्तर देने के लिए सभी को धन्यवाद। मैंने जोर्ग का जवाब स्वीकार कर लिया, क्योंकि यह सबसे विस्तृत है। मैं बाल्ड्रिक और एसएम भी +1 करता हूं उत्तर देने वाले पहले व्यक्ति होने के लिए। –

उत्तर

4

असल में, new इस तरह परिभाषित किया गया है: आप एक हासिल करने के प्रयोग कर रहे हैं

class Class 
    def allocate 
    # magic stuff for creating an empty object which cannot be expressed in Ruby: 

    new_obj = Deep::Within::VM.__somehow_magically_allocate_memory__! 

    new_obj.__class__ = self 

    new_obj 
    end 
end 
1

new वर्तमान कक्षा के निर्माता को कॉल करता है। कन्स्ट्रक्टर विधि initialize है जिसे कक्षा CollectionAssociation में self.build विधि के बाद परिभाषित किया गया है। यह new दोनों एक वर्ग विधि और एक उदाहरण के तरीके के रूप में Class में परिभाषित किया गया है @ Baldrick का जवाब है, जो सही है पर विस्तार करने के लिए शुद्ध रूबी (ruby guide)

1

है, और इसलिए सभी वर्गों के लिए उपलब्ध है।

newallocate और initialize दोनों का आविष्कार कर रहा है (मानते हैं कि initialize विधि परिभाषित की गई है)।

+0

मुझे नहीं लगता कि 'new' को क्लास विधि के रूप में परिभाषित किया गया है। 'कक्षा' वर्ग स्वयं का एक उदाहरण है (यानी, परिपत्र!), यही कारण है कि 'कक्षा। नया' काम करता है। –

+0

@ जोर्गब्लिमटैग मैं रूबी के इंटर्नल्स के विशेषज्ञ नहीं हूं, लेकिन दस्तावेज़ीकरण से पता चलता है कि अगर मैं सही ढंग से याद करता हूं तो नया कक्षा का एक वर्ग और उदाहरण विधि दोनों है। –

+0

असल में, यह 'कक्षा # प्रारंभिक' के लिए प्रलेखन है। आरडीओसी बस * कक्षा * नया 'के लिए प्रलेखन के रूप में * दिखाता है। यह * सभी * कक्षाओं के लिए करता है, क्योंकि इस तरह आप सामान्य रूप से * प्रारंभिक 'विधि का उपयोग करते हैं। आप वास्तव में इसे कॉल नहीं करते हैं, आपके पास 'नया' आपके लिए कॉल है। यदि आप स्रोत कोड देखते हैं, तो आप देख सकते हैं कि प्रलेखन ब्लॉक 'rb_class_initialize' फ़ंक्शन के ऊपर बैठता है जो 'कक्षा # प्रारंभिक' विधि से मेल खाता है। –

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