Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 将绝对路径与Pathname类连接_Ruby_Pathname - Fatal编程技术网

Ruby 将绝对路径与Pathname类连接

Ruby 将绝对路径与Pathname类连接,ruby,pathname,Ruby,Pathname,我正在处理一个项目,在这个项目中,我有一个动态确定的装载点,并获得了一组绝对路径,可以在目标卷上进行操作。因为这些文件还不存在,所以我使用Pathname类来处理文件名操作。然而,在连接具有相同根的路径时,Pathname似乎做了一些聪明的事情。我观察到以下行为: p1 = Pathname.new('/foo/bar') # #<Pathname:/foo/bar> p2 = Pathname.new('/baz/quux')

我正在处理一个项目,在这个项目中,我有一个动态确定的装载点,并获得了一组绝对路径,可以在目标卷上进行操作。因为这些文件还不存在,所以我使用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>
p1=Pathname.new('/foo/bar')##
p2=路径名。新建('/baz/qux')##
p3=p1+p2##
p4=p1.join p2.relative_path_from(Pathname.new('/'))##
p5=路径名。新(p1.to_.concat p2)##
因此,使用p4和p5,我能够得到我想要的行为,但是构造有点做作。有更干净的方法吗?

来自:

+(其他)

Pathname#+将一个Pathname片段附加到此片段以生成一个新的Pathname对象

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

我的。指定了路径名的
+
运算符以附加路径名片段,但带前导斜杠的路径名不是片段。文档没有明确指定如果您尝试添加两个路径名或向路径名添加一个非片段,会发生什么情况,但示例表明您看到了预期的行为。

在这里,使用字符串操作可以很容易地解决Ruby的奇怪行为

借用OP的例子

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

出于跨平台的原因,我们不应该单独添加每个目录吗?“bin”+“ruby”。@shabunc:这是一个更好的习惯,我只是引用了文档。
Pathname.new('/some/path/').to_s
# => "/some/path"