आप जानते होंगे कि रूबी कमांड-लाइन तर्कों को एआरजीवी नामक वैश्विक सरणी में चिपका देती है। लेकिन इसे एआरजीवी क्यों कहा जाता है? यह एक दिलचस्प इतिहास पाठ है जो रूबी की उत्पत्ति को सी में उजागर करता है।
तर्क वेक्टर
ARGV का मतलब तर्क वेक्टर है। और इस अजीब पुराने समय के उपयोग में "वेक्टर" का अर्थ है "एक आयामी सरणी।"
C में, प्रत्येक प्रोग्राम में एक main()
होता है समारोह। यह आमतौर पर कुछ इस तरह दिखता है:
int main(int argc, char *argv[]) {
... your code here
}
जैसा कि आपने शायद देखा, मुख्य कार्य में दो तर्क हैं। ये क्रमशः, एक गिनती और कमांड-लाइन तर्कों की एक सरणी हैं।
जब आप बैश को अपना प्रोग्राम चलाने के लिए कहते हैं, तो यह एक सिस्टम कॉल करता है जिसके कारण OS आपके प्रोग्राम के main
को कॉल करता है फ़ंक्शन और कुछ argc
. में पास करने के लिए और argv
मूल्य।
रूबी
रूबी दुभाषिया - एमआरआई कम से कम - सिर्फ एक सी प्रोग्राम है। ये रहा रूबी का main
समारोह:
int
main(int argc, char **argv)
{
#ifdef RUBY_DEBUG_ENV
ruby_set_debug_option(getenv("RUBY_DEBUG"));
#endif
#ifdef HAVE_LOCALE_H
setlocale(LC_CTYPE, "");
#endif
ruby_sysinit(&argc, &argv);
{
RUBY_INIT_STACK;
ruby_init();
return ruby_run_node(ruby_options(argc, argv));
}
}
जैसा कि आप देख सकते हैं, यह argc
. पास करता है और argv
ruby_options
. नामक फ़ंक्शन के लिए , जो बदले में ruby_process_options
. को कॉल करता है , जो process_options
. को कॉल करता है .
यह सभी रूबी दुभाषिया विकल्पों को संभालता है और अंततः ruby_set_argv
. को कॉल करता है , जो ARGV
. सेट करता है आप अपने रूबी कोड में देखते हैं।
void
ruby_set_argv(int argc, char **argv)
{
int i;
VALUE av = rb_argv;
#if defined(USE_DLN_A_OUT)
if (origarg.argv)
dln_argv0 = origarg.argv[0];
else
dln_argv0 = argv[0];
#endif
rb_ary_clear(av);
for (i = 0; i < argc; i++) {
VALUE arg = external_str_new_cstr(argv[i]);
OBJ_FREEZE(arg);
rb_ary_push(av, arg);
}
}
सुंदर स्वच्छ। मैं एमआरआई कोडबेस में गोता लगाने में अभी भी वास्तव में नया हूं, लेकिन इसमें कूदना और यह देखना मजेदार है कि चीजें कैसे काम करती हैं।