在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

我一直在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/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版本解决了这个问题。