Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

ARGV는 Ruby에서 어떻게 설정됩니까?

Ruby는 명령줄 인수를 ARGV라는 전역 배열에 집어넣는다는 것을 알고 있을 것입니다. 그런데 왜 ARGV라고 부르는 걸까요? C에서 Ruby의 기원을 강조하는 흥미로운 역사 수업입니다.

인수 벡터

ARGV는 인수 벡터를 나타냅니다. 그리고 이 이상하게 구시대적인 사용법에서 "벡터"는 "1차원 배열"을 의미합니다.

C에서 모든 프로그램에는 main()이 있습니다. 기능. 일반적으로 다음과 같습니다.

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

아마 눈치채셨겠지만, main 함수에는 두 개의 인수가 있습니다. 이들은 각각 명령줄 인수의 개수와 배열입니다.

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_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 코드베이스에 뛰어드는 것이 처음이지만, 정확히 어떻게 작동하는지 살펴보는 것은 일종의 재미입니다.