__FILE__在Ruby中是什么意思?


Answers:


144

它是对当前文件名的引用。在文件中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

87
这个答案不准确。FILE是从当前执行目录到文件的“相对”路径-不是绝对路径。您必须使用File.expand_path(FILE)来获取绝对路径
Luke Bayes

7
上面的注释中自动删除了双下划线。
路加斯·贝叶斯

1
在Ruby 1.9.2中仍然如此吗?
Zasz 2011年

4
@Zasz在1.9.2中工作有点不同。最初加载的文件具有相对的__FILE__,但是其他包含/必需的文件具有绝对路径。
杰夫2012年

9
@LukeBayes您可以通过使用反引号括住文字文本来在Stack Overflow注释中保留下划线和其他特殊字符。写`__FILE__`得到__FILE__
罗里·奥肯

62

的值__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版本解决了此问题。
Alec.Zhou


17

无论如何,在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")
Felix Rabe 2013年

3
您绝对不应对目录分隔符进行硬编码。请改用File.join:File.expand_path( File.join( File.dirname(__FILE__), "relative", "path", "to", "file") )
Andrew Hodgkinson
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.