为什么__FILE__大写和__dir__小写?

con*_*com 57 ruby syntax language-implementation

在Ruby 2.0.0-p0中,__dir__引入了变量以便于访问当前正在执行的文件的目录.

为什么__dir__大写时__FILE__是小写的?

Int*_*idd 60

我认为这是因为__FILE__是一个解析时常量,__dir__而是一个函数并返回File.dirname(File.realpath(__FILE__))

有关更多详细信息,请参阅本讨论


Tod*_*obs 31

TL; DR

语言实现选择的相对优点超出了合理的Stack Overflow问题的范围.但是,这是一个很好的问题,因为它确定了语言中可能令人困惑的用例,并试图澄清两种语言元素之间的区别.

类似于方法的关键字,方法和关键字

__FILE__ 是关键字

在Ruby 1.9中,__FILE__是一个关键字.尽管它看起来像是在Object类上定义的方法,但Object #__ FILE__的源代码是:

# File keywords.rb, line 68
def __FILE__
end
Run Code Online (Sandbox Code Playgroud)

在2.0.0-p0中快速扫描源并没有找到keywords.rb文件,但是假设在__FILE__语法上仍然是关键字.也许其他人可以指出您当前定义的位置.

__dir__ 是一种方法

内核#__ dir__实际上是一种方法.您可以通过使用内核定义的方法来自己看到这个:

Kernel.methods.grep /__dir__/
# => [:__dir__]
Run Code Online (Sandbox Code Playgroud)

错误和讨论

在一个bug和一些与bug相关的评论中,调用了__FILE__关键字和(某种)方法的事实.还讨论了Ruby-Core论坛中命名约定的各种优缺点.

虽然答案可能有点令人不满意,但这是目前的状况.如果这是一个你强烈关注的语言设计问题,那么参与Ruby核心团队将是解决它的正确方法.

  • 关键字表在[defs/keywords](https://github.com/ruby/ruby/blob/trunk/defs/keywords#L13)中定义(有趣的是,四年来没有变化) (4认同)