C एक्सटेंशन लिखने से आप C से रूबी के साथ इंटरैक्ट कर सकते हैं।
यदि कोई विशेष महत्वपूर्ण तरीका है जिसे आप C की गति के साथ अनुकूलित करना चाहते हैं, या यदि आप C लाइब्रेरी और रूबी के बीच एक इंटरफ़ेस बनाना चाहते हैं, तो आप ऐसा कर सकते हैं।
एक विकल्प FFI मॉड्यूल का उपयोग करना होगा।
अब :
आइए जानें कि C एक्सटेंशन कैसे लिखा जाता है!
आपका पहला C एक्सटेंशन
extconf.rb
. नाम की एक फाइल बनाएं इन सामग्रियों के साथ:
require 'mkmf' create_header create_makefile 'foobar'
फिर ruby extconf.rb
चलाएं जो आपके लिए कुछ फ़ाइलें बनाएगा (Makefile
&extconf.h
) इन फ़ाइलों को न बदलें।
अब foobar.c
create बनाएं , यह नाम create_makefile
. से आया है extconf.rb
. में लाइन . आप चाहें तो इसे बदल सकते हैं लेकिन इसे आपके .c
. से मेल खाना होगा इसके काम करने के लिए फ़ाइल नाम।
अंदर foobar.c
आप इसे जोड़ें:
#include "ruby.h" #include "extconf.h" void Init_foobar() { // Your C code goes here }
यह आपके सी एक्सटेंशन का मूल कंकाल है। ध्यान दें कि आपको extconf.rb
. पर घोषित नाम का उपयोग करना होगा प्लस शब्द Init_
. इस मामले में Init_foobar
।
आप इसे make
. चलाकर कंपाइल कर सकते हैं , और आपको जो मिलता है वह एक so
है फ़ाइल जिसे आप require
. का उपयोग करके अपने रूबी एप्लिकेशन में लोड कर सकते हैं ।
C से रूबी मेथड लिखना
आप c फ़ंक्शंस बना सकते हैं जिन्हें आप अपने रूबी कोड से कॉल कर सकते हैं। इस तरह से बिल्ट-इन क्लास और तरीके काम करते हैं।
सभी रूबी विधियों को VALUE
return वापस करना होगा . एक 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
. का उपयोग कर सकते हैं सी फ़ंक्शन को इस मॉड्यूल में संलग्न करने की विधि।
तर्क हैं :
तर्क | विवरण |
---|---|
mod | मॉड्यूल ऑब्जेक्ट |
“print_hello” | रूबी विधि का नाम |
rb_print_hello | C फंक्शन का नाम |
0 | इस विधि द्वारा लिए जाने वाले तर्कों की संख्या, चर तर्कों के लिए -1 का उपयोग करें |
अब make
run चलाएँ एक्सटेंशन को फिर से संकलित करने के लिए, और इसे इस तरह आज़माएँ:
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
. का मान ।
हर बार परिवर्तन करने पर अपने एक्सटेंशन को पुन:संकलित करना न भूलें 🙂
स्ट्रिंग्स के साथ कार्य करना
आपके सी फ़ंक्शन भी पैरामीटर ले सकते हैं।
उदाहरण के लिए:
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
, यह विधि कॉल प्राप्त करने वाली वस्तु है।
यदि आप इस विधि को स्ट्रिंग वर्ग पर ही परिभाषित करना चाहते हैं तो आप इसे इस प्रकार करेंगे:
void Init_foobar() { rb_define_method(rb_cString, "print_length", rb_print_length, 0); }
सारांश
आपने सीखा कि रूबी के लिए सी एक्सटेंशन कैसे लिखना है ताकि आप अपने रूबी कार्यक्रमों से सी की सारी शक्ति तक पहुंच सकें। आपने यह भी सीखा कि रूबी में सी फ़ंक्शन को कैसे उजागर किया जाए और सी से रूबी ऑब्जेक्ट्स जैसे स्ट्रिंग्स और हैश के साथ कैसे काम किया जाए।
यदि आपको रूबी से सी के साथ बातचीत करने के लिए और अधिक कार्यों की आवश्यकता है, तो आपको उन्हें रूबी के स्रोत कोड में ढूंढना पड़ सकता है और सी एक्सटेंशन कोड पढ़ना पड़ सकता है क्योंकि यह अच्छी तरह से प्रलेखित नहीं है।
आशा है कि आपको यह लेख उपयोगी और रोचक लगा होगा! अगर आपने किया है तो कृपया इसे अपने दोस्तों के साथ साझा करें ताकि वे भी इसका आनंद उठा सकें।