我正在做一个项目,在这个项目中,我有一个动态确定的挂载点,并且为我提供了一组在目标卷上工作的绝对路径。因为这些文件还不存在,所以我使用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,我能够获得我想要的行为,但其结构有点做作。有没有更干净的方法来做这件事?
发布于 2014-09-25 03:41:07
在这里,使用字符串操作可以很容易地解决Ruby的奇怪行为。
借用行动的例子..。
p1 = Pathname.new('/foo/bar')
p2 = '/baz/quux'
p1 + p2.sub(/\A\//, '')
# => #<Pathname:/foo/bar/baz/quux>警告:第二个p2必须是String,才能执行sub操作。您可以使用#to_s轻松地转换Pathname对象。
Pathname.new('/some/path/').to_s
# => "/some/path"发布于 2012-09-18 01:47:14
从fine manual
+(其他)
Pathname#+将路径名片段附加到此路径名片段,以生成新的路径名对象。
p1 = Pathname.new("/usr") #路径名:/usr p2 = p1 + "bin/ruby“#路径名:/usr/bin/ruby p3 = p1 + "/etc/passwd”#路径名:/etc/passwd
重点是我的。路径名的+运算符被指定为附加路径名片段,但带有前导斜杠的路径名不是片段。文档并没有明确指定当您尝试添加两个路径名或将非片段添加到路径名时会发生什么,但是示例表明您看到了预期的行为。
https://stackoverflow.com/questions/12464361
复制相似问题