__FILE__在Ruby中意味着什么?

时间:2008-10-22 03:28:20

标签: ruby

我一直在Ruby中看到这一点:

require File.dirname(__FILE__) + "/../../config/environment"  

__FILE__是什么意思?

4 个答案:

答案 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),您应该使用上面显示的构造来要求文件。