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