在Ruby中__FILE__是什么意思?
我一直在Ruby中看到这个:
require File.dirname(__FILE__) + "/../../config/environment"
__FILE__
是什么意思?
它是对当前文件名称的引用。 在文件foo.rb
, __FILE__
将被解释为"foo.rb"
。
编辑: Ruby 1.9.2和1.9.3performance出与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__
的值是一个相对path,在你的文件被加载时被创build和存储(但从未更新)。 这意味着如果您在应用程序的其他任何位置有任何对Dir.chdir
调用,则此path将错误地展开。
puts __FILE__ Dir.chdir '../../' puts __FILE__
解决此问题的一个方法是将__FILE__
的扩展值存储在任何应用程序代码之外。 只要您的require
语句位于您的定义的顶部(或者至less在调用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
位于dir /home/josh
则File.dirname(__FILE__)
将返回/home/josh
。
在Ruby中,Windows版本无论如何,我只是检查和__FILE__
不包含文件的完整path。 相反,它包含文件相对于执行的path。
在PHP __FILE__
是完整的path(在我看来是可取的)。 这就是为什么为了使你的path在Ruby中可移植,你真的需要使用这个:
File.expand_path(File.dirname(__FILE__) + "relative/path/to/file")
我应该注意到,在Ruby 1.9.1中, __FILE__
包含文件的完整path,上面的描述适用于我使用Ruby 1.8.7的情况。
为了兼容Ruby 1.8.7和1.9.1(不确定大约1.9),你应该使用我上面展示的构造文件来需要文件。