From: "kosaki (Motohiro KOSAKI)" <kosaki.motohiro@...>
Date: 2012-06-14T12:52:26+09:00
Subject: [ruby-dev:45736] [ruby-trunk - Feature #6587] proposal: adding new methods File.rootname and Pathname#rootname


Issue #6587 has been updated by kosaki (Motohiro KOSAKI).


心情的には賛成なんですが。。

> 例えば ruby 配布物の test/ 以下を見ると、独自にドライブレター周りを扱おうとしているコードが散見されますが、
> それぞれ異なる処理を書いており、UNC や拡張パス名(という名前でいいかどうかわかりませんが、"//?/" あるいは
>  "//./" で始まるもの)まで含めて適切に取り扱えているコードはほぼありません。

このパッチによってこのあたりがどこくらい綺麗に書けるようになるのかが、分かると積極的に賛成しやすいなあ、とか
思います。なにを心配してるかというと正規表現で書いた方が短くかけるなら、意識の高い人以外は誰も移行してくれなくて
賽の河原になるんじゃないかという不安がじゃっかんあったりなかったり

----------------------------------------
Feature #6587: proposal: adding new methods File.rootname and Pathname#rootname
https://bugs.ruby-lang.org/issues/6587#change-27238

Author: usa (Usaku NAKAMURA)
Status: Open
Priority: Normal
Assignee: 
Category: 
Target version: 2.0.0


みんな大好き Unixen ではパスの先頭は '/' で始まるものという暗黙の前提がありますが、Windows ではドライブレターおよび UNC というものがあるのでその前提が成り立たないことは広く知られていると思います。
Ruby はドライブレターや UNC はそれなりに適切に取り扱うようになっていますが、残念ながらパス名を処理する際には依然としてロジックを自前で用意する必要があります。
例えば ruby 配布物の test/ 以下を見ると、独自にドライブレター周りを扱おうとしているコードが散見されますが、それぞれ異なる処理を書いており、UNC や拡張パス名(という名前でいいかどうかわかりませんが、"//?/" あるいは "//./" で始まるもの)まで含めて適切に取り扱えているコードはほぼありません。

そこで、dirname、basename、extname などから類推して、rootname というメソッドを File の特異メソッドおよび Pathname のメソッドとして追加することを提案します。

: File.rootname(filename) -> String
  filename のうち、ルートディレクトリあるいはそれに相当する部分を文字列として返します。
  filename が相対パスなどの場合は ""(空文字列)を返します。
   # on Unixen
   p File.rootname("/foo/bar.txt") #=> "/" (absolute path)
   p File.rootname("bar.txt")      #=> ""  (relative path)

   # on Windows
   p File.rootname("/foo/bar.txt")         #=> "" (relative path)
   p File.rootname("bar.txt")              #=> "" (relative path)
   p File.rootname("C:/foo/bar.txt")       #=> "C:/" (normal absolute path)
   p File.rootname("C:bar.txt")            #=> "" (relative path)
   p File.rootname("//host/share/baz.txt") #=> "//host/share" (UNC absolute path)
   p File.rootname("//?/C:/foo/bar.txt")   #=> "//?/C:/" (extended form absolute path)

: Pathname#rootname
  Pathname.new(File.rootname(self.to_s)) と同じです。


-- 
http://bugs.ruby-lang.org/