在 Ruby 2.0.0-p0 中,__dir__
引入了该变量以便于访问当前正在执行的文件的目录。
为什么大写是__dir__
小写__FILE__
?
在 Ruby 2.0.0-p0 中,__dir__
引入了该变量以便于访问当前正在执行的文件的目录。
为什么大写是__dir__
小写__FILE__
?
我认为这是因为__FILE__
它是一个解析时间常数,而__dir__
它是一个函数并返回File.dirname(File.realpath(__FILE__))
有关更多详细信息,请参阅此讨论
语言实现选择的相对优点超出了合理的堆栈溢出问题的范围。然而,这是一个很好的问题,因为它确定了语言中可能令人困惑的用例,并试图澄清两种语言元素之间的区别。
__FILE__
是关键字在 Ruby 1.9 中,__FILE__
是一个关键字。尽管它看起来像在 Object 类上定义的方法,但Object#__FILE__的源代码说:
# File keywords.rb, line 68
def __FILE__
end
对 2.0.0-p0 中的源代码进行快速扫描并没有找到关键字 .rb 文件,但可以假设在__FILE__
语法上仍然是关键字。也许其他人可以将您指向当前定义的位置。
__dir__
是一种方法Kernel#__dir__实际上是一个方法。您可以通过 grepping 内核定义的方法来亲自查看:
Kernel.methods.grep /__dir__/
# => [:__dir__]
__FILE__
既是关键字又是(某种)方法的事实在错误和一些与错误相关的评论中被调用。Ruby-Core 论坛中还讨论了命名约定的各种利弊。
虽然答案可能有点不尽人意,但这就是目前的情况。如果这是您强烈关注的语言设计问题,那么加入 Ruby 核心团队将是解决它的正确方法。