Ruby Dir vs File vs Pathname?
В чем разница между классами Ruby Dir, File и Pathname? Кажется, что они имеют общие методы, такие как basename
, dirname
, glob
и join
. Когда используется одно преимущество над другим?
Путь кажется особенно странным при сравнении его функциональности с Dir и File.
Ответы
Ответ 1
В соответствии с документами Ruby для Dir, File и Pathname, у них определенно есть много общего.
Принцип, отличный от Dir
и File
, кажется, что Dir
предполагает, что объектом, с которым он работает, является каталог, а File
принимает файлы. Для большинства целей они, по-видимому, могут использоваться взаимозаменяемо, но даже если код работает, это может смутить любого, кто читает ваш код, если вы манипулируете каталогами с помощью File
и файлов с помощью Dir
.
Pathname
выглядит как многооконный метод поиска файлов и каталогов. Поскольку Windows и * nix-машины обрабатывают управление файлами по-разному, может быть больно ссылаться на файлы или каталоги по-конкретному ОС, если вы хотите, чтобы сценарии запускались в любом месте. Из документов:
Pathname представляет собой путь, который определяет файл в файловой системе. Имя пути зависит от ОС: Unix, Windows и т.д. Библиотека pathname работает с именами сторонних ОС. Однако не-Unix-пути поддерживаются экспериментально.
Он не представляет собой файл. Путь может быть относительным или абсолютным. Это не до тех пор, пока вы не попытаетесь ссылаться на файл, который даже имеет значение, существует ли файл или нет.
Имя пути является неизменным. У него нет метода деструктивного обновления.
Надеюсь, что это поможет.
Ответ 2
Одним из лучших ресурсов могут быть языковые документы, которые в этом случае http://www.ruby-doc.org/
Dir работает с каталогами, а примеры включают перечисление текущего рабочего каталога (pwd
), создание каталогов и их удаление.
Файл похож на Dir, но вместо этого работает с файлами, он получает и меняет разрешения, создает файлы и удаляет их.
Путь является своеобразным, как вы говорите, потому что он включает в себя все функциональные возможности File и некоторые из Dir, но если вы читаете документы, он точно скажет, почему он там. Из http://www.ruby-doc.org/stdlib-1.9.3/libdoc/pathname/rdoc/Pathname.html:
Значение этого класса заключается в том, чтобы обрабатывать информацию о пути файла более аккуратным способом, чем стандартный Ruby. Приведенные ниже примеры демонстрируют разницу. Все функциональные возможности File, FileTest и некоторых из Dir и FileUtils включены, что неудивительно. Это, по сути, фасад для всех этих и многое другое.
Надеюсь, что это помогает объяснить вещи.
Ответ 3
Pathname особенно интересен тем, что он использует удобство манипулирования путями и избегает манипулирования строкой строки и обратно при использовании этой строки в именах классов 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")
.