我在Ruby中经常看到这样的情况:
require File.dirname(__FILE__) + "/../../config/environment"
__FILE__是什么意思?
我在Ruby中经常看到这样的情况:
require File.dirname(__FILE__) + "/../../config/environment"
__FILE__是什么意思?
当前回答
它是对当前文件名的引用。在文件foo中。__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测试。Rb将输出
test.rb
/full/path/to/dir2/test.rb
其他回答
它是对当前文件名的引用。在文件foo中。__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测试。Rb将输出
test.rb
/full/path/to/dir2/test.rb
__FILE__的值是一个相对路径,在加载文件时创建并存储(但从不更新)。这意味着如果你给迪尔打过电话。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。__FILE__将是"foo.rb"。
如果foo。那么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),您应该使用上面展示的构造来要求文件。