Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is __FILE__ uppercase and __dir__ lowercase?

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?

like image 847
conradkleinespel Avatar asked Mar 03 '13 20:03

conradkleinespel


2 Answers

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

like image 111
Intrepidd Avatar answered Sep 19 '22 22:09

Intrepidd


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.

like image 22
Todd A. Jacobs Avatar answered Sep 18 '22 22:09

Todd A. Jacobs