2008-10-22 138 views
201

我看到这一切在Ruby中的时间:__FILE__在Ruby中的含义是什么?

require File.dirname(__FILE__) + "/../../config/environment" 

是什么__FILE__意思?

+0

帮扎在一起的引用,也见https://www.ruby-forum.com/topic/143383和http://stackoverflow.com/questions/4325759/is-require-file-expand- path-file-the-best-practice?lq = 1 – 2014-02-26 17:04:44

回答

133

它是对当前文件名的引用。在文件foo.rb中,__FILE__将被解释为"foo.rb"

编辑: Ruby 1.9.2和1.9.3的表现与Luke Bayes在his comment中的表现略有不同。与这些文件:

# test.rb 
puts __FILE__ 
require './dir2/test.rb' 
# dir2/test.rb 
puts __FILE__ 

运行ruby test.rb将输出

test.rb 
/full/path/to/dir2/test.rb 
+80

这个答案是不准确的。 __FILE__是从当前执行目录到文件的“相对”路径 - 不是绝对的。您必须使用文件。expand_path(__ FILE__)获取绝对路径 – 2009-09-09 21:29:57

+6

上面的注释中自动删除了双下划线。 – 2009-09-09 21:30:41

+1

在ruby 1.9.2中这仍然是真的吗? – Zasz 2011-09-03 15:58:07

24

__FILE__是用含有正被执行的代码的文件的扩展名的文件名。

foo.rb,__FILE__将是“foo.rb”。

如果foo.rb位于目录/home/josh那么File.dirname(__FILE__)将返回/home/josh

17

在Ruby中,Windows版本无论如何,我只是检查和__FILE__不包含文件的完整路径。相反,它包含文件相对于执行文件的路径。

在PHP __FILE__是完整的路径(在我看来这是最好的)。这就是为什么,为了使你的路在Ruby中随身携带,你真的需要使用这样的:

File.expand_path(File.dirname(__FILE__) + "relative/path/to/file") 

我要指出的是,在1.9.1 __FILE__包含该文件的完整路径,上面的描述是因为当时我使用Ruby 1.8.7。

为了与Ruby 1.8.7和1.9.1兼容(不确定约1.9),您应该使用上面显示的构造来需要文件。

59

__FILE__的值是在加载文件时创建并存储(但从未更新)的相对路径。这意味着如果您在应用程序的其他任何位置有任何对Dir.chdir的调用,此路径将错误地扩展。

puts __FILE__ 
Dir.chdir '../../' 
puts __FILE__ 

一种解决此问题的是存储的任何应用程序代码以外的__FILE__扩展后的值。只要您的require声明位于您的定义的顶部(或至少在对Dir.chdir的任何调用之前),该值在更改目录后仍然有用。

$MY_FILE_PATH = File.expand_path(File.dirname(__FILE__)) 

# open class and do some stuff that changes directory 

puts $MY_FILE_PATH