আপনি হয়তো জানেন যে রুবি ARGV নামক একটি গ্লোবাল অ্যারেতে কমান্ড-লাইন আর্গুমেন্ট আটকে রাখে। কিন্তু কেন হেক এটা ARGV বলা হয়? এটি একটি আকর্ষণীয় ইতিহাস পাঠ যা C.
এ রুবির উৎপত্তিকে হাইলাইট করেআর্গুমেন্ট ভেক্টর
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);
}
}
বেশ ঝরঝরে. আমি এমআরআই কোডবেসে ডাইভিং করার জন্য এখনও সত্যিই নতুন, কিন্তু ঝাঁপিয়ে পড়া এবং জিনিসগুলি কীভাবে কাজ করে তা দেখতে এক ধরণের মজা।