制作ruby路径名#join的简单方法就像File.join一样,而不是破坏接收者的路径?

时间:2011-07-12 15:41:19

标签: ruby filepath

根据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和string上运行。

这样的详细解决方案是不可接受的:

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

我可能会接受猴子补丁,但他们必须比这更好:

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

2 个答案:

答案 0 :(得分:4)

File.expand_path的行为与此相同,我认为这是正确的行为。

File.join以不同的方式运作,仅用于使用适当的分隔符连接路径的元素,其中使用/\或甚至:取决于在操作系统上。

File.expand_path在另一个上下文中解释路径规范,并允许以绝对路径不同的方式处理相对路径。这是一个重要的区别,特别是对于配置文件。

如果您要制作自己的方法,可能需要为其指定一个不同的名称,例如hard_joinconcat

答案 1 :(得分:0)

如何使用正则表达式去除任何前面的/

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