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

रूबी सी एक्सटेंशन्स में तर्क विश्लेषण में महारत हासिल करना:एक चरण-दर-चरण मार्गदर्शिका

<पी> रूबी एक अद्भुत भाषा है, जो पहले इंसानों के लिए बनाई गई और बाद में मशीनों के लिए। इसे पढ़ना और लिखना आसान है. कुछ भी लिखने के बहुत सारे तरीके हैं, और आप अक्सर अपने द्वारा चुनी गई विधि का नाम टाइप करके इसकी मानक लाइब्रेरी का अनुमान लगा सकते हैं।

<पी> इस वजह से, रूबी के तर्क बहुत लचीले हैं, जो हमें हमारे एपीआई को बहुत स्पष्ट रूप से व्यक्त करने की सुविधा देते हैं। लेकिन यह एक खामी के साथ आता है:Cextension डेवलपर्स के लिए रूबी को पार्स करना काफी कठिन है!

<पी> इस लेख में, हम एक जटिल रूबी एपीआई स्थापित करने के दो तरीकों के बारे में जानेंगे जो C में लिखा गया है:

  • साथ में rb_define_method और इसे rb_scan_args के साथ पार्स कर रहा हूं
  • रूबी इंटरफ़ेस का उपयोग करना
<पी> आइए शुरू करें!

सी और रूबी:एक परिचय

<पी> जैसा कि उल्लेख किया गया है, रूबी को सी एक्सटेंशन डेवलपर्स के लिए पार्स करना कठिन है।

<पी> उदाहरण के लिए:

 <पी> सी की सुंदरता, जिस भाषा में रूबी लिखी गई है, इसकी सादगी से उत्पन्न होती है, जिसमें इसके फ़ंक्शन पैरामीटर भी शामिल हैं:

  • <data-type> <variable-identifier>
  • ... विविध तर्कों के लिए।
<पी> ये आपको एक कोडबेस बनाए रखने में मदद करेंगे जिसे समझना बहुत कठिन नहीं है।

<पी> यहां C फ़ंक्शन को परिभाषित करने का सबसे जटिल तरीका है:

 <पी> जब आप अपने रूबी कोडबेस के लिए सी एक्सटेंशन को कोड करते हैं, तो आप यह समझना शुरू कर देंगे कि जटिलता कहाँ से शुरू होती है। लेकिन चिंता न करें - रूबी एमआरआई डेवलपर्स ने हमें कवर कर लिया है।

रूबी सी एक्सटेंशन में सरल विधि परिभाषा

<पी> हम एक ऐसी विधि से शुरुआत करेंगे जिसका उपयोग आपको किसी बिंदु पर करना होगा, rb_define_method .

<पी> आप इस रेपो में कोड उदाहरणों का भी अनुसरण कर सकते हैं।

<पी> यहां rb_define_method है के हस्ताक्षर:

 <पी> और रूबी के एक्सटेंशन.rdoc के अनुसार:

<पी> argc तर्कों की संख्या है। यदि argc -1 है, तो फ़ंक्शन को 3 तर्क प्राप्त होंगे:argc, argv, और self। यदि argc -2 है, तो फ़ंक्शन को 2 तर्क प्राप्त होंगे, self और args, जहां args विधि तर्कों की एक रूबी सरणी है।

<पी> संक्षेप में:

 <पी> इसलिए यदि आपके एपीआई में केवल निश्चित पैरामीटर लंबाई वाले तरीके हैं, या केवल एक वैरिएडिक पैरामीटर (def foo(*bar)) है ), आगे न पढ़ें - आपका काम हो गया! यदि आप अपने एपीआई को कॉल करने का बेहतर तरीका चाहते हैं, तो कृपया मेरे मेहमान बनें।

<पी> वैसे, यदि आप rb_define_method पर अधिक सम्मिलित उदाहरण चाहते हैं , मेरा सुझाव है कि आप परिभाषित विधियों पर पीटर झू का लेख पढ़ें।

रूबी सी एपीआई इंटरनल्स का उपयोग करना

<पी> तो, आइए अपने उपयोग के मामले पर वापस जाएं:जटिल तर्कों को पार्स करना। सौभाग्य से, कुछ उपकरण हमारी मदद कर सकते हैं।

<पी> लेकिन पहले, आइए केवल rb_define_method का उपयोग करने की सीमाएं देखें .

rb_define_method की कमियां

ब्लॉक तर्कों का कोई उल्लेख नहीं

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

आर्ग अलग-अलग हो सकते हैं

<पी> एक और महत्वपूर्ण सीमा यह है कि तर्क अलग-अलग हो सकते हैं, लेकिन मेथडकॉल स्वयं इतना सीमित नहीं है। इसलिए, यदि आप चाहते हैं कि आपका एपीआई def foo(bar, *baz) जैसा हो , आपको अपने तर्कों का विश्लेषण करना होगा। उस रास्ते पर आपकी मदद करने के लिए कुछ तरीके मौजूद हैं। rb_check_arity वह है जिसे आप rb_define_method के -1 संस्करण के साथ उपयोग कर सकते हैं .

<पी> यहां फ़ंक्शन हस्ताक्षर है:

 

कीवर्ड तर्क

<पी> एक आखिरी सीमा जिससे हम गुजरेंगे वह है कीवर्ड तर्कों का उपयोग। और मैंने आखिरी के लिए सर्वश्रेष्ठ रखा, क्योंकि वह इस लेख का मूल होगा।

<पी> इससे पहले कि हम उन्हें सही ढंग से पार्स कर सकें, हमें कीवर्ड तर्कों को पुनः प्राप्त करना होगा। सौभाग्य से, रूबी सी एपीआई इसके लिए एक विधि के साथ आती है,rb_scan_args .

<पी> यहां rb_scan_args है हस्ताक्षर:

 <पी> आप rb_scan_args पास कर लें argc और argv rb_define_method द्वारा दिया गया - एक स्ट्रिंग जो बताती है कि तर्कों को कैसे विभाजित किया जाना चाहिए (fmt ) और उन तर्कों के लिए रिसीवर। लीजिए, रूबी के सभी तर्कों की जटिलता को एक पंक्ति में पार्स कर दिया गया है! ख़ैर, लगभग.

<पी> fmt के औपचारिक प्रतिनिधित्व के लिए आप एक्सटेंशन.rdoc का संदर्भ ले सकते हैं लिखा जाना चाहिए, हालाँकि हम इसे नीचे दिए गए उदाहरणों में आंशिक रूप से कवर करेंगे।

फ़ंक्शन लिखें और पार्स करें:एक उदाहरण

<पी> इस आलेख के शेष भाग के लिए, आइए मान लें कि हम यह फ़ंक्शन लिखना चाहते हैं:

 <पी> rb_scan_args का उपयोग करके इसे पार्स किया जा रहा है इस तरह दिखेगा:

 <पी> "1*:" अस्पष्टता का अर्थ है:

  • 1 :एक आवश्यक स्थितिगत तर्क
  • * :किसी भी मात्रा में स्थितीय तर्क की आवश्यकता नहीं है
  • : :अंत में कीवर्ड तर्क

कीवर्ड तर्कों को पार्स करें

<पी> अब हमने विधि को बाधित कर दिया है, दुर्भाग्य से, हमने अभी तक ऐसा नहीं किया है। हमारा वर्तमान एपीआई def voronoi_diagram(envelope, *polygons, **kwargs) है .

<पी> अंत में, हमें rb_get_kwargs का उपयोग करके उन कीवर्ड तर्कों को पार्स करने की आवश्यकता है .

 <पी> आपको कुछ आवश्यक और वैकल्पिक तर्क चुनने होंगे। एक बार यह पूरा हो जाने पर, आप table का उपयोग करें रूबी को उन तर्कों का नाम बताने के लिए, और आप परिणाम को एक सरणी (values) में संग्रहीत करते हैं ).

 <पी> यह आपके पास है! एक जटिल रूबी विधि, जिसे केवल सी का उपयोग करके पार्स किया गया है। हालाँकि, यदि यह आपके लिए बहुत जटिल है, तो एक और विकल्प है।

रूबी इंटरफ़ेस का उपयोग करना

<पी> समस्या से निपटने का दूसरा तरीका वास्तव में सीधे रूबी के सिंटैक्स का उपयोग करना और रूबी चरण में पार्सिंग करना है।

 <पी> इससे आप सीधे rb_define_method के तीसरे फॉर्म का उपयोग कर सकते हैं , एक सी विधि के लिए जो इस तरह दिखती है:

 <पी> और वहां आप जाते हैं - आप एक शानदार समाधान के साथ समस्या से पूरी तरह से बचते हैं जो वास्तव में रूबी कार्यान्वयन में कुछ तरीकों के लिए उपयोग किया जाता है (Primitive के साथ) क्लास).

<पी> हालाँकि एमआरआई द्वारा उपयोग की जाने वाली कक्षा काफी जटिल है और स्वयं सी उत्पन्न करती है, हम इससे प्रेरणा ले सकते हैं।

<पी> आइए एक ऑब्जेक्ट बनाएं और दृश्यमान c_voronoi_diagram से बचने के लिए अपने तरीकों को प्लग करें हमारे एपीआई के उपयोगकर्ताओं के लिए:

 
 <पी> RGeo के कोडबेस में इस वर्ग का वास्तविक उपयोग मामला देखें।

तर्कों को पार्स करना:मुझे किस विधि का उपयोग करना चाहिए?

<पी> यह रेपो एक जटिल रूबी एपीआई स्थापित करने के दो तरीकों को दिखाता है जो सी में लिखा गया है - संक्षेप में:

  • rb_define_method के साथ और इसे rb_scan_args के साथ पार्स कर रहा हूं
  • रूबी इंटरफ़ेस का उपयोग करना
<पी> जब हम प्रदर्शन के संदर्भ में दोनों समाधानों की तुलना करते हैं, तो वे लगभग बराबर होते हैं (रूबी पार्सिंग मेरे एम1 पर औसतन 1.02 गुना तेज है)। इससे कोई खास फ़र्क नहीं पड़ता.

<पी> RGeo lib में, हमारी पहली डिज़ाइन पसंद एक एपीआई थी जो केवल विविध लंबाई तर्कों का उपयोग करती है। कोई कीवर्ड नहीं, कोई ब्लॉक नहीं. यह बहुत सीमित हो सकता है, और अब हम Primitive का उपयोग कर रहे हैं अधिक जटिल तर्कों की अनुमति देने का तरीका।

रूबी इंटरफ़ेस का उपयोग करने के लाभ

<पी> मेरी सलाह है कि रूबी इंटरफ़ेस का उपयोग कई कारणों से करें, जिनमें ये भी शामिल हैं:

  • कोड का आकार छोटा है
  • परिवर्तन करना आसान है
<पी> कुल मिलाकर, यह आपके कोडबेस को पढ़ने के अनुभव को सरल बनाता है।

<पी> रूबी उपयोगकर्ताओं को उनके द्वारा उपयोग किए जाने वाले रत्नों के स्रोत कोड को पढ़ने में शामिल करना मेरे लिए महत्वपूर्ण है। चूँकि रूबी को पढ़ना आसान है , रत्न भी होने चाहिए.

rb_define_method का उपयोग करने के लाभ

<पी> हालाँकि, सी संस्करण हमें कुछ बहुत उपयोगी आंतरिक तरीकों का स्वाद देता है। उदाहरण के लिए, rb_check_arity अभी भी वास्तव में उपयोगी है. ब्लॉकों को संभालने के तरीके भी बहुत अच्छे हैं, और आपको रूबी मुखौटा फोरब्लॉक का उपयोग करने की आवश्यकता नहीं हो सकती है।

<पी> यह सब आपके उपयोग के मामले के लिए सर्वोत्तम विकल्प ढूंढने के बारे में है।

समापन

<पी> इस पोस्ट में, हमने आपके रूबी सी एक्सटेंशन में तर्कों को पार्स करने के दो तरीकों की खोज की है - rb_define_method का उपयोग करके। (संक्षेप में इसकी सीमाओं पर भी नजर डालें) और इसे rb_scan_args के साथ पार्स करें और रूबी इंटरफ़ेस का उपयोग कर रहे हैं।

<पी> यदि आप C एक्सटेंशन के बारे में अधिक पढ़ना चाहते हैं, तो मैं अनुशंसा करता हूं:

  • स्क्रैच से रूबी सी एक्सटेंशन का निर्माण
  • सी-साइड के किनारे एक रूबीस्ट की सैर
  • मैक पर रूबी सी एक्सटेंशन के साथ काम करना
<पी> और आपके लिए मेरी सलाह का अंतिम शब्द:RGeo देखें। यह सक्रिय विकास में व्यापक रूप से उपयोग किया जाने वाला सी एक्सटेंशन कोडबेस है। मेरे अधिकांश उदाहरण यहीं से आते हैं।

<पी> हैप्पी कोडिंग!

<पी> पी.एस. यदि आप प्रेस से हटते ही रूबी मैजिक पोस्ट पढ़ना चाहते हैं, तो हमारे रूबी मैजिक न्यूज़लेटर की सदस्यता लें और एक भी पोस्ट न चूकें! रूबी सी एक्सटेंशन्स में तर्क विश्लेषण में महारत हासिल करना:एक चरण-दर-चरण मार्गदर्शिका

यूलिसे बुओनोमो

<पी> हमारे अतिथि लेखक यूलिसे एक पूर्व उद्योग रूबी डेवलपर हैं जो अपना अधिकांश समय दुनिया भर में यात्रा करने के लिए समर्पित करते हैं। उनका खाली समय आरजीओ और रूबी को समर्पित है, और उन्हें रूबी के अंदरूनी हिस्सों के साथ छेड़छाड़ करना पसंद है।

<पी> यूलिसे बुओनोमो

द्वारा सभी लेख
  1. सीएसएस के साथ स्टाइलिंग टेबल सीएसएस के साथ स्टाइलिंग टेबल

    CSS के साथ तालिकाओं को स्टाइल करने के लिए, हम सीमाएँ, पतन, चौड़ाई और ऊँचाई निर्धारित कर सकते हैं। हम पैडिंग भी सेट कर सकते हैं, उसमें टेक्स्ट को संरेखित कर सकते हैं, आदि। आइए कुछ उदाहरण देखें - उदाहरण CSS में किसी तालिका में बॉर्डर जोड़ने के लिए, बॉर्डर प्रॉपर्टी का उपयोग करें। आइए अब एक उदाहरण देख

  1. जावास्क्रिप्ट फ़ंक्शन पैरामीटर्स जावास्क्रिप्ट फ़ंक्शन पैरामीटर्स

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

  1. MongoDB में व्यर्थ स्थान को कम करने की रणनीतियाँ MongoDB में व्यर्थ स्थान को कम करने की रणनीतियाँ

    ऐपबॉय मोबाइल ऐप्स के लिए दुनिया का अग्रणी मार्केटिंग ऑटोमेशन प्लेटफॉर्म है। हम अपने ग्राहकों के मोबाइल ऐप में उपयोगकर्ता क्या कर रहे हैं, इस पर नज़र रखते हुए और उन्हें अपने व्यवहार या जनसांख्यिकी के आधार पर ईमेल, पुश नोटिफिकेशन और इन-ऐप संदेशों के लिए उपयोगकर्ताओं को लक्षित करने की अनुमति देकर हर मह