Как реализованы константы __LINE__ и __FILE__ в Ruby?

Кажется, что константы __FILE__ и __LINE__ динамически обновляются с текущим текущим номером файла и строки, мне интересно, как поведение, реализованное в Ruby?

Я скопировал исходный код, но слишком много шумов для внешнего вида __LINE__ и __FILE__, мне интересно, кто-нибудь может помочь мне указать на исходный код и дать ключ к пониманию его поведения.

Объяснение в Rubinis или MRI будет в порядке.

Ответ 1

Оба __FILE__ и __LINE__ заменяются литералами непосредственно в парсере:

case keyword__FILE__:
    return NEW_STR(rb_external_str_new_with_enc(ruby_sourcefile, strlen(ruby_sourcefile),
                                                rb_filesystem_encoding()));
case keyword__LINE__:
    return NEW_LIT(INT2FIX(tokline));

Другими словами, они ведут себя точно так, как если бы вы сами ввели строку или номер.

Обратите внимание, что для __LINE__ этот не всегда ведет себя так, как вы ожидали.