2012-09-17 86 views
3

我正在開發一個項目,其中有一個動態確定的安裝點,並提供了一組絕對路徑以在目標捲上進行工作。由於這些文件還不存在,我正在使用Pathname類來處理文件名操作。然而,當涉及到連接具有相同根的路徑時,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,我能夠得到我想要的行爲,但結構有點做作。有沒有更乾淨的方法來做到這一點?

回答

3

fine manual

+(其它)

路徑名#+追加路徑片段這一個以產生新的路徑名對象。

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

重點煤礦。路徑名的+運算符指定爲追加路徑名片段,但帶有前導斜槓的路徑名不是片段。該文檔沒有明確指定如果嘗試添加兩個路徑名或將非片段添加到路徑名時應該發生的情況,但這些示例暗示您看到了預期的行爲。

+0

不應該爲了跨平臺的原因分別添加每個目錄 - 「bin」+「ruby」。 – shabunc

+0

@shabunc:這將是一個更好的習慣,我只是引用了文檔。 –

3

在這裏使用字符串操作解決Ruby的奇怪行爲相當容易。

借用了OP的例子...

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"