Sua pergunta me estimulou a abrir a fonte do interpretador Ruby e ver como __FILE__
realmente funciona. A resposta é bem interessante: é implementada dentro do analisador. O lexer tem um tipo de token especial para __FILE__
. Quando o analisador vê esse token, ele o converte em uma constante de string, que contém o nome do arquivo no qual o analisador está trabalhando.
Da linha 14948 do ext / ripper / ripper.c:
case keyword__FILE__:
return NEW_STR(rb_external_str_new_with_enc(ruby_sourcefile, strlen(ruby_sourcefile),
rb_filesystem_encoding()));
Acho que isso deve deixar claro que tentar fazer com que __FILE__
retorne o nome do arquivo incluído é completamente impossível, a menos que você invada a fonte do interpretador Ruby ou escreva seu próprio pré-processador, que transforma __FILE__
em outra coisa antes passando a fonte Ruby para o intérprete!