Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

ARGVはRubyでどのように設定されますか?

Rubyがコマンドライン引数をARGVと呼ばれるグローバル配列に固定していることをご存知かもしれません。しかし、なぜそれはARGVと呼ばれるのですか?これは、CでのRubyの起源を強調する興味深い歴史のレッスンです。

引数ベクトル

ARGVは引数ベクトルの略です。そして、この奇妙な昔ながらの用法における「ベクトル」は、「1次元配列」を意味します。

Cでは、すべてのプログラムにmain()があります。 関数。通常、次のようになります。

int main(int argc, char *argv[]) {  
  ... your code here
}

お気づきかもしれませんが、main関数には2つの引数があります。これらはそれぞれ、コマンドライン引数の数と配列です。

bashにプログラムを実行するように指示すると、システムコールが実行され、OSがプログラムのmainを呼び出します。 関数と特定のargcを渡す およびargv 値。

ルビー

Rubyインタープリター(少なくともMRI)は単なるCプログラムです。これがRubyの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インタープリターオプションを処理し、最終的に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);
    }
}

かなりきちんと。私はまだMRIコードベースに飛び込むのは本当に新しいですが、飛び込んで物事がどのように機能するかを正確に確認するのはちょっと楽しいです。


  1. RubyでStructとOpenStructを使用する方法

    Rubyの構造体とは何ですか? 構造体は組み込みのRubyクラスであり、値オブジェクトを生成する新しいクラスを作成するために使用されます。値オブジェクトは、関連する属性を一緒に格納するために使用されます。 ここに例があります : Point 2つの座標(x &y 。 このデータはさまざまな方法で表すことができます。 いいね : 配列[10, 20] ハッシュ{ x: 10, y: 10 } オブジェクトPoint.new(10, 20) 複数のPointを使用する場合 、オブジェクトアプローチを使用することをお勧めします。 しかし… これら2つの値を一緒に格納するた

  2. Redis SMEMBERS –Redisでセットのすべての要素を取得する方法

    このチュートリアルでは、コマンド– SMEMBERS を使用して、キーに格納されている設定値のすべての要素を取得する方法について学習します。 redis-cliで。 redis SMEMBERSコマンドの構文は次のとおりです:- 構文:- redis host:post> SMEMBERS <key name> 出力:- - array value, containing all elements of the set.- error, if key exist and value stored at the key is not a set. 例:-