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コードベースに飛び込むのは本当に新しいですが、飛び込んで物事がどのように機能するかを正確に確認するのはちょっと楽しいです。
-
RubyでStructとOpenStructを使用する方法
Rubyの構造体とは何ですか? 構造体は組み込みのRubyクラスであり、値オブジェクトを生成する新しいクラスを作成するために使用されます。値オブジェクトは、関連する属性を一緒に格納するために使用されます。 ここに例があります : Point 2つの座標(x &y 。 このデータはさまざまな方法で表すことができます。 いいね : 配列[10, 20] ハッシュ{ x: 10, y: 10 } オブジェクトPoint.new(10, 20) 複数のPointを使用する場合 、オブジェクトアプローチを使用することをお勧めします。 しかし… これら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. 例:-