我经常在Ruby中看到这种情况:
require File.dirname(__FILE__) + "/../../config/environment"
__FILE__
是什么意思?
我经常在Ruby中看到这种情况:
require File.dirname(__FILE__) + "/../../config/environment"
__FILE__
是什么意思?
这是对当前文件名的引用。在文件foo.rb
中,__FILE__
将被解释为"foo.rb"
。
编辑: Ruby 1.9.2和1.9.3的行为似乎与Luke Bayes在他的评论中所说的有些不同。使用以下文件:
# test.rb
puts __FILE__
require './dir2/test.rb'
# dir2/test.rb
puts __FILE__
运行ruby test.rb
将输出
test.rb
/full/path/to/dir2/test.rb
\
__FILE__`可得到
__FILE__`。 - Rory O'Kane\
__FILE__`` 之前,请不要在 Ruby 中编写此代码,除非你想让世界可能爆炸。 - Ben Aubin__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
__FILE__
是包含执行代码的文件的带扩展名的文件名。
在 foo.rb
中,__FILE__
将是 "foo.rb"。
如果 foo.rb
在目录 /home/josh
中,则 File.dirname(__FILE__)
将返回 /home/josh
。
__FILE__
不包含文件的完整路径。它包含相对于执行文件的路径。__FILE__
是完整路径(我认为这更好)。这就是为什么为了使你的路径在Ruby中可移植,你真的需要使用这个的原因:File.expand_path(File.dirname(__FILE__) + "relative/path/to/file")
需要注意的是,在Ruby 1.9.1中,__FILE__
包含文件的完整路径。上述描述是针对我使用Ruby 1.8.7时的情况。
为了兼容Ruby 1.8.7和1.9.1(不确定1.9),您应该使用我上面展示的结构来引入文件。
File.expand_path(File.dirname(__FILE__) + "/relative/path/to/file")
- Felix RabeFile.expand_path(File.join(File.dirname(__FILE__), "relative", "path", "to", "file"))
- Andrew Hodgkinson__FILE__ == $0
,而对于其余文件则是绝对路径。这对于__FILE__ == $0
类型的检查(自执行文件)非常方便。更多信息请参见我的其他评论。 - x-yuri