66

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

为什么大写是__dir__小写__FILE__

4

2 回答 2

67

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

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

于 2013-03-03T20:53:35.813 回答
37

TL; 博士

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

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

__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 核心团队将是解决它的正确方法。

于 2013-03-03T21:33:23.853 回答