Простой способ заставить ruby ​​Pathname # join действовать как File.join и не загромождать путь получателя? - PullRequest
1 голос
/ 12 июля 2011

Согласно rubydoc, если аргумент, переданный Pathname # join (или Pathname # +), является абсолютным, путь получателя метода полностью игнорируется. Пример:

Pathname('/home/foo').join '/etc/passwd'
# => #<Pathname:/etc/passwd>

но

File.join('/home/foo', '/etc/passwd')
# => "/home/foo/etc/passwd"

Путь, как правило, приятно использовать, но его поведение при соединении очень раздражает, и я не могу вспомнить, когда бы я хотел, чтобы это произошло.

Существует ли существующий метод, который действует как File.join? Он должен работать с путевым именем и строкой.

Такое подробное решение недопустимо:

Pathname( File.join(pn, '/etc/passwd') )

Я могу принять патчи обезьян, но они должны быть лучше, чем это:

class Pathname
  def safe_join(other)
    Pathname.new(File.join(self, other))
  end
end

Ответы [ 2 ]

4 голосов
/ 12 июля 2011

File.expand_path ведет себя так же, как это, и я бы сказал, что это правильное поведение.

File.join работает по-другому и просто служит для соединения элементов пути с соответствующим разделителем, где /, \ или даже : используются в зависимости от ОС.

File.expand_path интерпретирует спецификацию пути в контексте другого и позволяет обрабатывать относительные пути иначе, чем абсолютные пути. Это важное различие, особенно для файлов конфигурации.

Если вы собираетесь создать свой собственный метод, вы можете присвоить ему другое имя, например hard_join или concat.

0 голосов
/ 12 июля 2011

Как насчет использования регулярных выражений для удаления любых предшествующих /:

Pathname('/home/foo').join('/etc/passwd'[/[^\/].+$/])
# => #<Pathname:/home/foo/etc/passwd>
...