C एक्सटेंशन लिखने से आप C से रूबी के साथ इंटरैक्ट कर सकते हैं।
आप ऐसा करना चाह सकते हैं यदि कोई विशेष महत्वपूर्ण मेथड है जिसे आप C की गति से अनुकूलित करना चाहते हैं, या यदि आप एक C लाइब्रेरी और रूबी के बीच एक इंटरफेस बनाना चाहते हैं।
एक विकल्प FFI मॉड्यूल का उपयोग करना होगा।
अब:
आइए खोजें कि C एक्सटेंशन कैसे लिखें!
आपका पहला C एक्सटेंशन
extconf.rb नामक एक फाइल बनाएं जिसमें ये सामग्री हो:
require 'mkmf' create_header create_makefile 'foobar'
फिर ruby extconf.rb चलाएं जो आपके लिए कुछ फाइलें बनाएगा (Makefile और extconf.h)। इन फाइलों को न बदलें।
अब foobar.c बनाएं, यह नाम extconf.rb में create_makefile लाइन से आता है। आप इसे बदल सकते हैं लेकिन यह आपके .c फाइलनाम से मेल खाना चाहिए ताकि यह काम कर सके।
foobar.c के अंदर आप इसे जोड़ें:
#include "ruby.h" #include "extconf.h" void Init_foobar() { // आपका C कोड यहां जाता है } यह आपके C एक्सटेंशन का बुनियादी कंकाल है। ध्यान दें कि आपको extconf.rb में घोषित नाम का उपयोग करना होगा और साथ में Init_ शब्द। इस मामले में Init_foobar।
आप इसे make चलाकर संकलित कर सकते हैं, और जो आपको मिलता है वह एक so फाइल है जिसे आप require का उपयोग करके अपने रूबी एप्लिकेशन में लोड कर सकते हैं।
C से एक रूबी मेथड लिखना
आप C फंक्शन्स बना सकते हैं जिन्हें आप अपने रूबी कोड से कॉल कर सकते हैं। इसी तरह बिल्ट-इन क्लासेस और मेथड्स काम करते हैं।
सभी रूबी मेथड्स को VALUE लौटाना होता है। एक VALUE एक रूबी ऑब्जेक्ट है।
उदाहरण:
VALUE rb_return_nil() { return Qnil; } अब हमें इस फंक्शन को एक रूबी क्लास या मॉड्यूल से जोड़ने की आवश्यकता है। आप एक नई क्लास बना सकते हैं या मौजूदा का उपयोग कर सकते हैं।
यहां मैं एक मॉड्यूल बना रहा हूं:
void Init_foobar() { VALUE mod = rb_define_module("RubyGuides"); rb_define_method(mod, "return_nil", rb_return_nil, 0); } आप rb_define_method मेथड का उपयोग करके C फंक्शन को इस मॉड्यूल से जोड़ सकते हैं।
आर्ग्युमेंट्स हैं:
| आर्ग्युमेंट | विवरण |
|---|---|
| mod | मॉड्यूल ऑब्जेक्ट |
| "print_hello" | रूबी मेथड का नाम |
| rb_print_hello | C फंक्शन का नाम |
| 0 | यह मेथड कितने आर्ग्युमेंट्स लेता है, वेरिएबल आर्ग्युमेंट्स के लिए -1 का उपयोग करें |
अब एक्सटेंशन को संकलित करने के लिए फिर से make चलाएं, और इसे इस तरह आज़माएं:
require 'foobar' include RubyGuides print_hello
वहाँ जाएं, आपने अभी रूबी से एक C फंक्शन कॉल किया!
C से एक रूबी हैश बनाना
अक्सर आप C से रूबी ऑब्जेक्ट्स बनाना और हेरफेर करना चाहेंगे।
आप C API का उपयोग करके ऐसा कर सकते हैं।
उदाहरण के लिए, एक हैश बनाने और इसमें कुछ तत्व जोड़ने के लिए:
VALUE create_hash() { hash = rb_hash_new(); rb_hash_aset(hash, rb_str_new2("test"), INT2FIX(1)); return hash; } यहां दो महत्वपूर्ण चीजें नोटिस करें, पहला rb_str_new2 फंक्शन, यह एक रूबी स्ट्रिंग बनाता है।
फिर INT2FIX मैक्रो, यह एक नियमित पूर्णांक को रूबी पूर्णांक में परिवर्तित करता है।
अब यदि आप rb_define_method का उपयोग करके इस फंक्शन को रूबी में उजागर करते हैं तो आपको एक नियमित रूबी हैश मिलेगा जिसमें एक कुंजी (test) और 1 का मान होगा।
हर बार जब आप परिवर्तन करते हैं तो अपने एक्सटेंशन को पुनः संकलित करना न भूलें 🙂
स्ट्रिंग्स के साथ काम करना
आपके C फंक्शन्स पैरामीटर्स भी ले सकते हैं।
उदाहरण के लिए:
VALUE rb_print_length(VALUE self, VALUE str) { if (RB_TYPE_P(str, T_STRING) == 1) { return rb_sprintf("String length: %ld", RSTRING_LEN(str)); } return Qnil; } void Init_foobar() { rb_define_global_function("print_length", rb_print_length, 1); } यहां हम एक VALUE (रूबी ऑब्जेक्ट) को आर्ग्युमेंट के रूप में ले रहे हैं और फिर RB_TYPE_P मैक्रो के साथ सुनिश्चित करते हैं कि यह एक स्ट्रिंग है। उसके बाद, हम RSTRING_LEN मैक्रो का उपयोग करके स्ट्रिंग की लंबाई प्रिंट करते हैं।
यदि आप स्ट्रिंग डेटा के लिए एक पॉइंटर चाहते हैं तो आप RSTRING_PTR मैक्रो का उपयोग कर सकते हैं।
उदाहरण:
VALUE rb_print_data(VALUE self, VALUE str) { if (RB_TYPE_P(str, T_STRING) == 1) { return rb_sprintf("String length: %s", RSTRING_LEN(str)); } return Qnil; } यहां एक और पैरामीटर भी ध्यान दें, self, यह वह ऑब्जेक्ट है जो मेथड कॉल प्राप्त कर रहा है।
यदि आप इस मेथड को String क्लास पर ही परिभाषित करना चाहते हैं तो आप इसे इस तरह करेंगे:
void Init_foobar() { rb_define_method(rb_cString, "print_length", rb_print_length, 0); } सारांश
आपने रूबी के लिए C एक्सटेंशन लिखना सीखा ताकि आप अपने रूबी प्रोग्राम्स से C की पूरी शक्ति का उपयोग कर सकें। आपने यह भी सीखा कि C फंक्शन्स को रूबी में कैसे उजागर करें और C से रूबी ऑब्जेक्ट्स जैसे स्ट्रिंग्स और हैश के साथ कैसे काम करें।
यदि आपको C से रूबी के साथ इंटरैक्ट करने के लिए अधिक फंक्शन्स की आवश्यकता है तो आपको उन्हें रूबी के सोर्स कोड में ढूंढना पड़ सकता है और C एक्सटेंशन कोड पढ़ना पड़ सकता है क्योंकि यह अच्छी तरह से डॉक्यूमेंटेड नहीं है।
आशा है कि आपने इस लेख को उपयोगी और दिलचस्प पाया! यदि आपने किया तो कृपया इसे अपने दोस्तों के साथ शेयर करें ताकि वे भी इसका आनंद ले सकें।