Ruby的Dir,File和Pathname类有什么区别?他们似乎也有同感像常用的方法basename,dirname,glob,和join.何时使用一个优于另一个?
在将其功能与Dir和File进行比较时,路径名似乎特别奇怪.
lyo*_*eta 14
根据Dir,File和Pathname的Ruby文档,它们似乎有很多共同之处.
假设它正在使用的对象是一个目录并假设文件,它之间的原则Dir和假设File似乎不同.在大多数情况下,它们显然可以互换使用,但即使代码有效,如果您使用和使用文件操作目录,任何读取代码的人都可能会感到困惑.DirFileFileDir
Pathname看起来是一种定位文件和目录的多操作系统方法.由于Windows和*nix机器以不同的方式处理文件管理,如果您希望脚本在任何地方运行,以特定于操作系统的方式引用文件或目录可能会很麻烦.来自文档:
Pathname表示在文件系统中定位文件的路径名.路径名取决于操作系统:Unix,Windows等.路径名域库与本地操作系统的路径名一起使用.但是,实验上支持非Unix路径名.
它不代表文件本身.路径名可以是相对的或绝对的.直到您尝试引用该文件,它甚至无论该文件是否存在都是重要的.
路径名是不可变的.它没有破坏性更新的方法.
希望这可以帮助.
小智 5
最好的资源之一是语言文档,在这种情况下,它是http://www.ruby-doc.org/
Dir 正在处理目录,示例包括列出当前工作目录 ( pwd)、创建目录和删除它们。
File 与 Dir 类似,但处理的是 Files,例如获取和更改权限、创建文件和删除它们。
正如您所说,路径名很奇特,因为它确实包含 File 的所有功能和 Dir 的一些功能,但是如果您阅读文档,它会告诉您它为什么存在。从http://www.ruby-doc.org/stdlib-1.9.3/libdoc/pathname/rdoc/Pathname.html:
此类的价值是以比标准 Ruby 提供的更简洁的方式操作文件路径信息。下面的示例演示了差异。File、FileTest 的所有功能以及 Dir 和 FileUtils 的一些功能都以一种不足为奇的方式包含在内。它本质上是所有这些以及更多的外观。
希望这有助于解释事情。
路径名特别有趣,因为它具有操作路径的便利性,并且在File和Dir类名中使用该字符串时避免了来回字符串操作。一个例子:
require 'pathname'
def log_stuff(directory, data)
path = Pathname.new(directory)
raise "Directory does not exist" unless path.exist?
raise "Path given is not a directory" unless path.directory?
path += "development.log"
path.open("a") { |io| io.write data }
end
Run Code Online (Sandbox Code Playgroud)
您还可以看到它正在Rails的路径中使用,这也使您可以做一些有趣的事情:
$ rails c
> Rails.root
=> #<Pathname:/home/kibet/code/ruby/sample_app>
> Rails.root.join("config", "database.yml")
=> #<Pathname:/home/kibet/code/ruby/sample_app/config/database.yml>
> _.read
=> "development:\n adapter: postgresql\n...
Run Code Online (Sandbox Code Playgroud)
相对于File.join(Rails.root, "config", "database.yml")。