为什么__FILE__是大写而__dir__是小写?

69
在Ruby 2.0.0-p0中,引入了__dir__变量,以便轻松访问当前正在执行的文件所在的目录。
为什么__dir__是小写而__FILE__是大写?

7
__FILE__是一个常量,而__dir__则是一个方法:http://permalink.gmane.org/gmane.comp.lang.ruby.core/52295。 - SwiftMango
__FILE__ 不是一个常量。根据 Kernel.const_get,它甚至不是一个有效的常量名称。 - Pascal
2个回答

70
我认为这是因为__FILE__是一个解析时常量,而__dir__是一个函数并返回File.dirname(File.realpath(__FILE__))
更多详情请见这个讨论

这是我发现关于 Ruby 很烦人的极少数事情之一。哎呀。 - Nathan Lilienthal
链接已过期。 - ndnenkov

38

简述

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

关键字、方法和看起来像方法的关键字

__FILE__是关键字

在Ruby 1.9中,__FILE__是一个关键字。即使它看起来像是Object类上定义的一个方法,Object#__FILE__的源代码也表明:

# File keywords.rb, line 68
def __FILE__
end

我快速扫描了2.0.0-p0版本的源代码,没有找到keywords.rb文件,但可以假设__FILE__在句法上仍然是关键字。也许其他人可以指出当前定义的位置。

__dir__是一个方法

Kernel#__dir__实际上是一个方法。您可以通过grep Kernel的定义方法来自行查看:

Kernel.methods.grep /__dir__/
# => [:__dir__]
错误和讨论

__FILE__ 既是关键字又是(有点儿)方法这一事实在错误中得到了指出,并且还有一些与错误相关的评论。Ruby核心团队在Ruby-Core论坛上讨论了各种命名约定的利弊。

虽然答案可能有点不尽人意,但那是目前的状况。如果您对语言设计问题有很强的感受,则参与Ruby核心团队将是解决此问题的适当方式。


4
关键字表格的定义在 defs/keywords 中(有趣的是,这已经四年没有改变了)。 - dbenhur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接