Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Ruby

रूबी के MRI सोर्स कोड में डीप डाइव

यदि आप कुछ समय से रूबी का उपयोग कर रहे हैं तो आप इस बारे में उत्सुक हो सकते हैं कि हुड के नीचे कुछ चीजें कैसे काम करती हैं।

रूबी इंटर्नल्स में गहराई से जाने का एक तरीका वह सोर्स कोड पढ़ना है जो इसे काम करता है। भले ही आप C न जानते हों, फिर भी आप कुछ दिलचस्प चीजें सीख सकते हैं।

सोर्स कोड रूबी के लिए गिटहब रेपो पर पाया जा सकता है।

आदर्श रूप से, आप Codequery जैसे टूल का उपयोग करना चाहते हैं जो आपको आसानी से क्लास और मेथड नाम खोजने की अनुमति देता है।

कोर क्लासेस की खोज

आपकी अधिकांश खोज रूट फोल्डर में होगी। यहीं आपको 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 खोज सकते हैं।

रूबी के MRI सोर्स कोड में डीप डाइव

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 में, 'st' भाग का अर्थ 'सिंबल टेबल' है, और यह सिर्फ एक हैश टेबल है। rb_const_set फंक्शन Object क्लास पर एक कॉन्स्टेंट सेट करता है, यह क्लास को हर जगह उपलब्ध कराएगा।

और rb_class_inherited सुपरक्लास के inherited मेथड को कॉल करता है, आप इस मेथड के लिए डॉक्यूमेंटेशन यहां पा सकते हैं।

कोड का अगला भाग मेथड परिभाषाओं से बना है। MRI इसके लिए 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 है।

स्टैंडर्ड लाइब्रेरी की खोज

ठीक है, आज के लिए इतना C काफी है!

कुछ रूबी कोड पढ़ने के बारे में क्या ख्याल है?

रूबी स्टैंडर्ड लाइब्रेरी रूबी में लिखी गई है और आप इसे /lib डायरेक्टरी के तहत पा सकते हैं।

स्टैंडर्ड लाइब्रेरी में OpenStruct, Base64 एन्कोडिंग और Set डेटा संरचना जैसी चीजें शामिल हैं।

एक सेट एक सरणी के समान है, लेकिन इस विशेष गुण के साथ कि सभी एलिमेंट्स अद्वितीय हैं। दूसरे शब्दों में, एक सेट में कोई डुप्लिकेट नहीं होता।

यह कैसे काम करता है? क्या इसके पीछे कोई फैंसी एल्गोरिदम हैं?

यदि हम set.rb पर एक नज़र डालते हैं तो आप जल्दी से पता लगा लेंगे कि यह एक Hash ऑब्जेक्ट द्वारा समर्थित है।

 # दिए गए ऑब्जेक्ट को सेट में जोड़ता है और self लौटाता है। कई एलिमेंट्स जोड़ने के लिए +merge+ का उपयोग करें।
def add(o)
  @hash[o] = true
  self
end
alias << add 

तो यदि आप एक डुप्लिकेट एलिमेंट जोड़ते हैं, तो यह जांचने की कोई आवश्यकता नहीं है कि यह पहले से मौजूद है, यह बस पुराने को ओवरराइट कर देगा।

रूबिनियस की खोज

रूबी के सोर्स कोड का पता लगाने का एक और तरीका रूबिनियस जैसे वैकल्पिक कार्यान्वयन को देखना है।

रूबिनियस कोड MRI की तुलना में अलग तरीके से व्यवस्थित है, इसलिए इसके लिए मुझे गिटहब और 'फाइंड फाइल' फीचर का उपयोग करना पसंद है।

रूबी के MRI सोर्स कोड में डीप डाइव

यदि आप Enumerable के बारे में अधिक जानना चाहते हैं तो आप बस 'enumerable' टाइप करें और आपको सभी संबंधित फाइलें दिखाई देंगी।

निष्कर्ष

जैसा कि आपने देखा, आप बिना ज्यादा मेहनत के सीख सकते हैं कि रूबी हुड के नीचे चीजें कैसे करता है। आगे बढ़ें और अपने दम पर खोज करें और सभी को बताएं कि आपने क्या खोजा!

अगर आपको यह पोस्ट पसंद आई तो मेरे न्यूज़लेटर में शामिल होना न भूलें, बस नीचे दिए गए फॉर्म में अपना ईमेल डालें और आपको मुफ्त अपडेट और विशेष सामग्री प्राप्त होगी।


  1. - रूबी के मेथड लुकअप पाथ में महारत: मेथड्स कैसे रिजॉल्व होते हैं

    आप क्या सोचते हैं जब आप एक मेथड कॉल करते हैं? रूबी कैसे तय करता है कि किस मेथड को कॉल करना है जब उसी नाम का एक और मेथड होता है? क्या आपने कभी सोचा है कि मेथड कहां स्थित है या कहां से आता है? रूबी सही मेथड को कॉल करने और नो मेथड एरर वापस करने का सही समय निर्धारित करने के लिए एक परिभाषित तरीके या पैटर

  1. - Ruby और Rails में मेथड डेलीगेशन में महारत: एक व्यावहारिक गाइड

    यह लेख Ruby में मेथड डेलीगेशन के बारे में है। आप delegate मेथड, Forwardable मॉड्यूल और SimpleDelegator क्लास का उपयोग करना सीखेंगे। हमें डेलीगेशन की आवश्यकता क्यों है? ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में, क्लासेज के एक साथ काम करने के दो तरीके हैं। वे हैं: इनहेरिटेंस (विरासत) कंपोजिशन (संरचना) इनहे

  1. - आपका रेल्स कोड कहां जाता है? नॉन-CRUD लॉजिक को व्यवस्थित करना

    रेल्स ट्यूटोरियल्स खत्म करने और अपना खुद का ऐप शुरू करने के बाद, चीजें भ्रमित हो जाती हैं। जैसे आपका नॉन-CRUD, सामान्य लॉजिक कहां जाता है? ट्विटर से फॉलोअर्स लेना MVC में कैसे फिट बैठता है? दो लोगों से पूछें, और आपको चार उत्तर मिलेंगे। या आपका थ्रेड घंटों तक एक-दूसरे का अपमान करने वाले स्मार्ट लोगों