在Ruby 2.0.0-p0中,引入了
为什么
__dir__
变量,以便轻松访问当前正在执行的文件所在的目录。为什么
__dir__
是小写而__FILE__
是大写?__dir__
变量,以便轻松访问当前正在执行的文件所在的目录。__dir__
是小写而__FILE__
是大写?语言实现选择的相对优点不在一个合理的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核心团队将是解决此问题的适当方式。
__FILE__
是一个常量,而__dir__
则是一个方法:http://permalink.gmane.org/gmane.comp.lang.ruby.core/52295。 - SwiftMango__FILE__
不是一个常量。根据Kernel.const_get
,它甚至不是一个有效的常量名称。 - Pascal