Why is __FILE__ uppercase and __dir__ lowercase?

后端 未结 2 735
谎友^
谎友^ 2020-12-05 01:19

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__

相关标签:
2条回答
  • 2020-12-05 02:02

    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.

    0 讨论(0)
  • 2020-12-05 02:11

    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

    0 讨论(0)
提交回复
热议问题