在Ruby中,“文件”是什么意思?
我一直在Ruby中看到这一点:在Ruby中,“文件”是什么意思?,ruby,Ruby,我一直在Ruby中看到这一点: require File.dirname(__FILE__) + "/../../config/environment" \uuuu FILE\uuuu是什么意思?它是对当前文件名的引用。在文件foo.rb中,\uuu文件\uuuu将被解释为“foo.rb” Edit:Ruby 1.9.2和1.9.3的表现似乎与Luke Bayes在文章中所说的稍有不同。使用这些文件: #test.rb 放置文件__ 需要“/dir2/test.rb” #dir2/tes
require File.dirname(__FILE__) + "/../../config/environment"
\uuuu FILE\uuuu
是什么意思?它是对当前文件名的引用。在文件foo.rb
中,\uuu文件\uuuu
将被解释为“foo.rb”
Edit:Ruby 1.9.2和1.9.3的表现似乎与Luke Bayes在文章中所说的稍有不同。使用这些文件:
#test.rb
放置文件__
需要“/dir2/test.rb”
#dir2/test.rb
放置文件__
运行ruby test.rb
将输出
test.rb
/完整/path/to/dir2/test.rb
\uuuuu FILE\uuuuu
是包含正在执行的代码的文件扩展名的文件名
在foo.rb
中,文件将是“foo.rb”
如果foo.rb
在dir/home/josh
中,那么File.dirname(\uuuuu File\uuuu)
将返回Ruby中的/home/josh,不管怎样,Windows版本中的\uu File\uuuu
不包含文件的完整路径。相反,它包含相对于文件执行位置的文件路径
在PHP中,文件是完整的路径(我认为这是最好的)。这就是为什么,为了使您的路径在Ruby中可移植,您确实需要使用:
File.expand_path(File.dirname(__FILE__) + "relative/path/to/file")
我应该注意到,在Ruby 1.9.1中,文件包含文件的完整路径,上面的描述是在我使用Ruby 1.8.7时使用的
为了兼容Ruby 1.8.7和1.9.1(不确定1.9),您应该使用我上面介绍的构造来要求文件。文件的值是在加载文件时创建和存储(但从不更新)的相对路径。这意味着,如果您在应用程序中的任何其他地方调用了Dir.chdir
,此路径将不正确地扩展
puts __FILE__
Dir.chdir '../../'
puts __FILE__
解决此问题的一个方法是将\uuuu FILE\uuu
的扩展值存储在任何应用程序代码之外。只要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是当前执行目录中文件的“相对”路径,不是绝对路径。您必须使用File.expand_path(File)来获取绝对路径。上面的注释中自动删除了双下划线。ruby 1.9.2中仍然是这样吗?@Zasz它在1.9.2中的工作方式有所不同。最初加载的文件有一个相对的文件,但其他包含的/必需的文件有绝对路径。@LukeBayes您可以在堆栈溢出注释中保留下划线和其他特殊字符,方法是在文本周围加上反勾。写`uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu+1:=)@EthanA指向需要在相对路径前加斜杠的文档的链接:File.expand\u path(File.dirname(+/relative/path/to/File))
永远不要硬编码目录分隔符。改为使用File.join:File.expand\u path(File.join(File.dirname(\uu File\uu),“relative”,“path”,“to”,“File”))
若要帮助将引用绑定在一起,请参见和这意味着如果在应用程序中的任何其他位置调用Dir.chdir,此路径将无法正确扩展。
在我的测试中正确扩展了路径。我的ruby版本是2.3.7,可能是更新的ruby版本解决了这个问题。