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

एमआरआई स्रोत कोड की खोज

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

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

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

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

मुख्य कक्षाओं को एक्सप्लोर करना

आपका अधिकांश अन्वेषण रूट फ़ोल्डर में होगा। यहीं पर आपको 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 . के बारे में अधिक जानना चाहते हैं तो आप बस 'गणना योग्य' टाइप करें और आपको सभी संबंधित फाइलें दिखाई देंगी।

निष्कर्ष

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

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


  1. रूबी विधि लुकअप को समझना

    आपको क्या लगता है कि जब आप किसी विधि को कॉल करते हैं तो क्या होता है? रूबी कैसे तय करती है कि उसी नाम से दूसरी विधि होने पर किस विधि को कॉल करना है? क्या आपने कभी सोचा है कि विधि कहाँ से रखी गई है या कहाँ से प्राप्त की गई है? रूबी कॉल करने के लिए सही विधि और कोई विधि त्रुटि नहीं वापस करने के लिए सह

  1. रूबी और रूबी ऑन रेल्स में मेथड्स कैसे डेलिगेट करें?

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

  1. आपका कोड कहां जाता है?

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