In Ruby 2.0.0-p0, the __dir__
variable was introduced for easy access to the directory of the file currently being executed.
Why is __dir__
lowercase when __FILE__
is uppercase?
In Ruby 2.0.0-p0, the __dir__
variable was introduced for easy access to the directory of the file currently being executed.
Why is __dir__
lowercase when __FILE__
is uppercase?
I think that is because __FILE__
is a parse-time constant whereas __dir__
is a function and returns File.dirname(File.realpath(__FILE__))
For more details, see This discussion
The relative merits of language implementation choices are outside the scope of a reasonable Stack Overflow question. However, this is a good question because it identifies a potentially confusing use case in the language and seeks to clarify the distinction between the two language elements.
__FILE__
is a KeywordIn Ruby 1.9, __FILE__
is a keyword. Even though it looks like a method defined on the Object class, the source for Object#__FILE__ says:
# File keywords.rb, line 68
def __FILE__
end
A quick scan of the source in 2.0.0-p0 didn't turn up a keywords.rb file, but one assumes that __FILE__
syntactically remains a keyword. Perhaps someone else can point you to the location of the current definition.
__dir__
is a MethodKernel#__dir__ is actually a method. You can see this for yourself by grepping the Kernel's defined methods:
Kernel.methods.grep /__dir__/
# => [:__dir__]
The fact that __FILE__
is both a keyword and (sort of) a method is called out in a bug and some bug-related commentary. There was also discussion of the various pros and cons of the naming convention in the Ruby-Core Forum.
While the answer may be a bit unsatisfactory, that's the current state of affairs. If it's a language design issue you feel strongly about, getting involved with the Ruby core team would be the proper way to address it.
© 2022 - 2024 — McMap. All rights reserved.
__FILE__
is constant and__dir__
is method: permalink.gmane.org/gmane.comp.lang.ruby.core/52295 – Indisposed__FILE__
is not a constant. According toKernel.const_get
it is not even a valid name for a constant. – Preponderant