Ruby の Dir、File、および Pathname クラスの違いは何ですか? basename
、dirname
、glob
、 などの一般的なメソッドを共有しているようですjoin
。一方を他方より有利に使用するのはいつですか?
パス名は、その機能を Dir および File と比較すると、特に奇妙に思えます。
Ruby の Dir、File、および Pathname クラスの違いは何ですか? basename
、dirname
、glob
、 などの一般的なメソッドを共有しているようですjoin
。一方を他方より有利に使用するのはいつですか?
パス名は、その機能を Dir および File と比較すると、特に奇妙に思えます。
Dir、File、およびPathnameの Ruby ドキュメントによると、それらには多くの共通点があるようです。
Dir
との間の原則の違いは、操作対象のオブジェクトがディレクトリであり、ファイルであると想定しているFile
ようです。ほとんどの目的で、それらは互換的に使用できるように見えますが、コードが機能する場合でも、 を使用してディレクトリを操作し、 を使用してファイルを操作すると、コードを読む人が混乱する可能性があります。Dir
File
File
Dir
Pathname
ファイルとディレクトリを見つけるためのマルチOS方式のようです。Windows と *nix マシンではファイル管理が異なるため、スクリプトをどこでも実行したい場合、OS 固有の方法でファイルやディレクトリを参照するのは面倒です。ドキュメントから:
Pathname は、ファイルシステム内のファイルを見つけるパス名を表します。パス名は OS によって異なります: Unix、Windows など。パス名ライブラリは、ローカル OS のパス名で動作します。ただし、Unix 以外のパス名は実験的にサポートされています。
ファイル自体を表すものではありません。パス名は、相対または絶対にすることができます。ファイルが存在するかどうかが問題になるのは、ファイルを参照しようとするまではありません。
パス名は不変です。破壊的な更新の方法はありません。
お役に立てれば。
パス名は、パスを操作し、その文字列を 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
また、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...
とは対照的にFile.join(Rails.root, "config", "database.yml")
。
最高のリソースの1つは、この場合は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の一部の機能が、驚くことではない方法で含まれています。これは本質的に、これらすべて、およびそれ以上のファサードです。
それが物事を説明するのに役立つことを願っています。