Ответ 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__
этот не всегда ведет себя так, как вы ожидали.