5

我正在做一个项目,我有一个动态确定的挂载点,并提供了一组绝对路径来处理目标卷。由于这些文件还不存在,我使用 Pathname 类来处理文件名操作。然而,在连接具有相同根的路径时,Pathname 似乎做了一些聪明的事情。我观察到以下行为:

p1 = Pathname.new('/foo/bar')                         # #<Pathname:/foo/bar>
p2 = Pathname.new('/baz/quux')                        # #<Pathname:/baz/quux>
p3 = p1 + p2                                          # #<Pathname:/baz/quux>
p4 = p1.join p2.relative_path_from(Pathname.new('/')) # #<Pathname:/foo/bar/baz/quux>
p5 = Pathname.new(p1.to_s.concat p2)                  # #<Pathname:/foo/bar/baz/quux>

所以使用 p4 和 p5,我能够得到我想要的行为,但是结构有点做作。有没有更清洁的方法来做到这一点?

4

2 回答 2

5

在这里使用字符串操作来解决 Ruby 的奇怪行为相当容易。

借用OP的例子......

p1 = Pathname.new('/foo/bar')
p2 = '/baz/quux'
p1 + p2.sub(/\A\//, '')
# => #<Pathname:/foo/bar/baz/quux>

警告:第二个p2必须是 aString才能进行sub操作。您可以Pathname使用#to_s.

Pathname.new('/some/path/').to_s
# => "/some/path"
于 2014-09-24T19:41:06.960 回答
4

来自精美手册

+(其他)

Pathname#+ 将路径名片段附加到此片段以生成新的 Pathname 对象。

p1 = Pathname.new("/usr")      # Pathname:/usr
p2 = p1 + "bin/ruby"           # Pathname:/usr/bin/ruby
p3 = p1 + "/etc/passwd"        # Pathname:/etc/passwd

强调我的。指定路径名的+运算符以附加路径名片段,但带有前导斜杠的路径名不是片段。如果您尝试添加两个路径名或向路径名添加非片段,文档没有明确指定应该发生什么,但这些示例暗示您正在看到预期的行为。

于 2012-09-17T17:47:14.490 回答