我一直在Ruby中看到这一点:
require File.dirname(__FILE__) + "/../../config/environment"
__FILE__
是什么意思?
答案 0 :(得分:142)
它是对当前文件名的引用。在文件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
答案 1 :(得分:61)
__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
答案 2 :(得分:28)
__FILE__
是包含正在执行的代码的文件扩展名的文件名。
在foo.rb
中,__FILE__
将为“foo.rb”。
如果foo.rb
中有/home/josh
,那么File.dirname(__FILE__)
会返回/home/josh
。
答案 3 :(得分:17)
在Ruby中,无论如何是Windows版本,我刚检查过,__FILE__
不包含该文件的完整路径。相反,它包含文件相对于执行位置的路径。
在PHP __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),您应该使用上面显示的构造来要求文件。