我一直在Ruby中看到这个:
require File.dirname(__FILE__) + "/../../config/environment"
什么__FILE__
意思?
它是对当前文件名的引用.在文件中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__
是在加载文件时创建和存储(但从未更新)的相对路径.这意味着,如果您对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
__FILE__
是包含正在执行的代码的文件扩展名的文件名.
在foo.rb
,__FILE__
将是"foo.rb".
如果foo.rb
在dir中/home/josh
然后File.dirname(__FILE__)
会返回/home/josh
.
在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),您应该使用上面显示的构造来要求文件.