Answers:
它是对当前文件名的引用。在文件中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__
。
的值__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
This means that if you have any calls to Dir.chdir anywhere else in your application, this path will expand incorrectly.
在我的测试下,路径正确扩展了。我的ruby版本是2.3.7,也许较新的ruby版本解决了此问题。
__FILE__
是带有执行代码的文件扩展名的文件名。
在中foo.rb
,__FILE__
将是“ foo.rb”。
如果foo.rb
是在目录/home/josh
,然后File.dirname(__FILE__)
将返回/home/josh
。
无论如何,在Windows版本的Ruby中,我只是检查了一下,__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)兼容,您应该使用上面显示的结构来请求文件。
File.expand_path(File.dirname(__FILE__) + "/relative/path/to/file")
File.expand_path( File.join( File.dirname(__FILE__), "relative", "path", "to", "file") )