यदि आप कुछ समय से रूबी का उपयोग कर रहे हैं तो आप इस बारे में उत्सुक हो सकते हैं कि कुछ चीजें हुड के नीचे कैसे काम करती हैं।
रूबी आंतरिक में गहरी खुदाई करने का एक तरीका स्रोत कोड को पढ़ना है जो इसे काम करता है। अगर आप सी को नहीं जानते हैं, तब भी आप कुछ दिलचस्प चीजें सीख सकते हैं।
रूबी के लिए जीथब रेपो पर स्रोत कोड पाया जा सकता है।
आदर्श रूप से, आप कोडक्वेरी जैसे टूल का उपयोग करना चाहते हैं जो आपको आसानी से क्लास और मेथड के नाम खोजने की अनुमति देता है।
मुख्य कक्षाओं को एक्सप्लोर करना
आपका अधिकांश अन्वेषण रूट फ़ोल्डर में होगा। यहीं पर आपको Object
. जैसे सभी मुख्य वर्गों के लिए सोर्स कोड मिलेगा object.c
. में या Array
array.c
. में ।
आइए एक नज़र डालते हैं hash.c
. पर ।
यदि आप 4468 पंक्ति तक स्क्रॉल करते हैं तो आपको कुछ ऐसे नाम दिखाई देंगे जो परिचित होने चाहिए।
आइए इसे शुरू करें :
rb_cHash = rb_define_class("Hash", rb_cObject);
इस लाइन में, Hash
वर्ग को rb_define_class
. द्वारा परिभाषित किया जा रहा है समारोह। दूसरा तर्क (rb_cObject
) इस वर्ग के लिए सुपरक्लास है।
यदि आप सीखना चाहते हैं कि किसी वर्ग को परिभाषित करने की प्रक्रिया कैसे काम करती है तो आप rb_define_class
खोजें ।
rb_define_class
. से पहला भाग जाँचता है कि क्या वर्ग को पहले ही परिभाषित किया जा चुका है।
if (rb_const_defined(rb_cObject, id)) { // ... }
उसके अंदर if
ब्लॉक, रूबी कुछ विवेक जांच करता है, जैसे यह सुनिश्चित करना कि हम पहले से परिभाषित कक्षा के साथ काम कर रहे हैं।
यदि वर्ग परिभाषित नहीं है तो इसे इस तरह परिभाषित किया जाता है:
klass = rb_define_class_id(id, super); st_add_direct(rb_class_tbl, id, klass); rb_name_class(klass, id); rb_const_set(rb_cObject, id, klass); rb_class_inherited(super, klass); return klass;
आप इन सभी विधियों की परिभाषा पढ़ सकते हैं, लेकिन मुझे लगता है कि वे बहुत आत्म-व्याख्यात्मक हैं।
st_add_direct
. में , 'सेंट' भाग का अर्थ है 'प्रतीक तालिका', और यह सिर्फ एक हैश तालिका है। rb_const_set
फ़ंक्शन Object
. पर एक स्थिरांक सेट करता है वर्ग, यह कक्षा को हर जगह उपलब्ध कराएगा।
और rb_class_inherited
inherited
. को कॉल करता है सुपरक्लास की विधि, आप इस विधि के लिए दस्तावेज़ यहाँ पा सकते हैं।
कोड का अगला भाग विधि परिभाषाओं से बना है। एमआरआई rb_define_method
. का उपयोग करता है ऐसा करने के लिए।
यहां एक उदाहरण दिया गया है :
rb_define_method(rb_cHash,"index", rb_hash_index, 1); rb_define_method(rb_cHash,"size", rb_hash_size, 0); rb_define_method(rb_cHash,"length", rb_hash_size, 0); rb_define_method(rb_cHash,"empty?", rb_hash_empty_p, 0);
तर्क इस तरह से चलते हैं :
- पहला तर्क वह वर्ग है जिस पर इस पद्धति को परिभाषित किया जा रहा है
- दूसरा तर्क विधि का नाम है, तीसरा तर्क C फ़ंक्शन है जो वास्तव में इस पद्धति को लागू करता है
- आखिरी तर्क इस रूबी विधि के लिए आवश्यक तर्कों की संख्या है (एक नकारात्मक मान का अर्थ वैकल्पिक तर्क है)
rb_define_singleton_method
फ़ंक्शन का उपयोग क्लास मेथड को परिभाषित करने के लिए किया जाता है।
rb_define_singleton_method(rb_cHash, "[]", rb_hash_s_create, -1);
rb_define_singleton_method
. का मुख्य भाग कोड की सिर्फ एक पंक्ति है:
rb_define_method(singleton_class_of(obj), name, func, argc);
यदि आप खोज जारी रखना चाहते हैं, तो देखने के लिए एक अच्छी फ़ाइल है object.c
।
मानक पुस्तकालय की खोज
ठीक है, आज के लिए इतना ही काफी है!
कुछ रूबी कोड पढ़ने के बारे में क्या?
रूबी स्टैंडर्ड लाइब्रेरी रूबी में लिखी गई है और आप इसे /lib
. के तहत पा सकते हैं निर्देशिका।
मानक पुस्तकालय में OpenStruct, Base64
. जैसी चीज़ें होती हैं एन्कोडिंग और Set
डेटा संरचना।
एक सेट एक सरणी के समान है, लेकिन विशेष संपत्ति के साथ कि सभी तत्व अद्वितीय हैं। दूसरे शब्दों में, एक सेट में कोई डुप्लीकेट नहीं होता है।
वह कैसे काम करता है? क्या इसके पीछे कोई फैंसी एल्गोरिदम हैं?
अगर हम set.rb
. पर एक नज़र डालें तो आप जल्दी से पाएंगे कि यह एक Hash
. द्वारा समर्थित है वस्तु।
# Adds the given object to the set and returns self. Use +merge+ to # add many elements at once. def add(o) @hash[o] = true self end alias << add
इसलिए यदि आप एक डुप्लीकेट तत्व जोड़ते हैं, तो यह जांचने की कोई आवश्यकता नहीं है कि क्या यह पहले से मौजूद है, यह केवल पुराने को अधिलेखित कर देगा।
रूबिनियस को एक्सप्लोर करना
रूबी के सोर्स कोड को एक्सप्लोर करने का एक और तरीका है, रूबिनियस जैसे वैकल्पिक कार्यान्वयनों पर एक नज़र डालना।
रुबिनियस कोड एमआरआई से अलग तरीके से व्यवस्थित किया गया है, इसलिए इसके लिए मैं जीथब और 'फाइंड फाइल' फीचर का उपयोग करना पसंद करता हूं।
अगर आप Enumerable
. के बारे में अधिक जानना चाहते हैं तो आप बस 'गणना योग्य' टाइप करें और आपको सभी संबंधित फाइलें दिखाई देंगी।
निष्कर्ष
जैसा कि आपने देखा है, आप सीख सकते हैं कि रूबी बिना किसी प्रयास के हुड के नीचे कैसे काम करती है। आगे बढ़ें और अपने आप एक्सप्लोर करें और सभी को बताएं कि आपने क्या खोजा!
यदि आप इस पोस्ट को पसंद करते हैं तो मेरे न्यूज़लेटर में शामिल होना न भूलें, बस अपना ईमेल नीचे दिए गए फॉर्म में दें और आपको मुफ्त अपडेट और विशेष सामग्री प्राप्त होगी।