obtener __file__ __dir__ ruby syntax language-implementation

ruby - __file__ - require dirname(__ file__)



¿Por qué__FILE__ en mayúscula y__dir__ en minúscula? (2)

TL; DR

Los méritos relativos de las opciones de implementación del lenguaje están fuera del alcance de una pregunta razonable sobre desbordamiento de pila. Sin embargo, esta es una buena pregunta porque identifica un caso de uso potencialmente confuso en el lenguaje y busca aclarar la distinción entre los dos elementos del lenguaje.

Palabras clave, métodos y palabras clave que parecen métodos

__FILE__ es una palabra clave

En Ruby 1.9, __FILE__ es una palabra clave. Aunque parece un método definido en la clase Object, la fuente para Object#__FILE__ dice:

# File keywords.rb, line 68 def __FILE__ end

Una exploración rápida de la fuente en 2.0.0-p0 no apareció un archivo keywords.rb, pero se supone que __FILE__ sintácticamente sigue siendo una palabra clave. Quizás alguien más pueda indicarle la ubicación de la definición actual.

__dir__ es un método

Kernel#__dir__ es en realidad un método. Puede ver esto usted mismo al agregar los métodos definidos del kernel:

Kernel.methods.grep /__dir__/ # => [:__dir__]

Errores y discusiones

El hecho de que __FILE__ es una palabra clave y (más o menos) un método se menciona en un error y algunos comentarios relacionados con errores . También se discutieron los diversos pros y contras de la convención de nombres en el Ruby-Core Forum .

Si bien la respuesta puede ser un poco insatisfactoria, ese es el estado actual de las cosas. Si se trata de un problema de diseño del idioma que usted siente con firmeza, involucrarse con el equipo central de Ruby sería la forma adecuada de abordarlo.

En Ruby 2.0.0- __dir__ , se introdujo la variable __dir__ para acceder fácilmente al directorio del archivo que se está ejecutando actualmente.

¿Por qué __dir__ minúsculas cuando __FILE__ está en mayúscula?


Creo que es porque __FILE__ es una constante de tiempo de análisis mientras que __dir__ es una función y devuelve File.dirname(File.realpath(__FILE__))

Para más detalles, vea esta discusión