2008-10-22 124 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