Why is __FILE__ uppercase and __dir__ lowercase?

RubySyntaxLanguage Implementation

Ruby Problem Overview


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?

Ruby Solutions


Solution 1 - Ruby

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

Solution 2 - Ruby

TL; DR

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.

Keywords, Methods, and Keywords That Look Like Methods

__FILE__ is a Keyword

In 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 Method

Kernel#__dir__ is actually a method. You can see this for yourself by grepping the Kernel's defined methods:

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

Bugs and Discussions

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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionconradkleinespelView Question on Stackoverflow
Solution 1 - RubyIntrepiddView Answer on Stackoverflow
Solution 2 - RubyTodd A. JacobsView Answer on Stackoverflow