読者です 読者をやめる 読者になる 読者になる

Pathname - ファイル名のグッドラッパー

http://www.ruby-lang.org/ja/man/?cmd=view;name=pathname

先日のRails勉強会でetoさんにPathnameというパスやファイル名のすごい便利なライブラリを教えて貰った。で、早速使ってみたところめっちゃ便利でいま書いてるアプリケーションじゃほとんどのファイル名の操作に使ってるという。
使い方はめっちゃ簡単でパスやファイル名を引数としてオブジェクトを作るだけ。

require 'pathname'

file = '/tmp/foo'
path = Pathname.new file

で、これの何が便利っていうとリファレンスマニュアルのメソッドを眺めて貰うと解るんだけど、ファイル関係の操作が何でもできてしまう。通常だとFileオブジェクトを作るには実体が無いとダメなんだけど無くてももちろん作れるため

str = IO.read(file) if FileTest.file?(file)

str = path.read if path.file?

と書ける。シンプルだしOOっぽい!

path.exist?
path.mkdir
path.chown 'apache'
path.dirname

とかも思った通りに動く。もちろんPathnameと云うだけあってpath操作も充実。

path + 'bar'
=> /tmp/foo/bar
path + '..' 
=> /tmp
path + '.././../tmp/./foo/bar' 
=> "/tmp/./../tmp/./foo/bar"
(path + '.././../tmp/./foo/bar').cleanpath
=> "/tmp/foo/bar"
path.join 'bar'
=> /tmp/foo/bar

便利だー。いままでファイル名の文字列が '/' で終わってるかどうか解らないときとか + '/bar' とかしてたんだけどPathname使うようになってからはいちいち考えなくてすむし。
etoさんはPathname依存症らしくStringにメソッド追加して

class String
  def to_path
    Pathname.new self
  end
end

path = filename.to_path

みたいにして使ってるみたい。たしかにString#to_pathが欲しくなるぐらいPathname便利だわぁ。
で、このグッドラッパーの作者は田中哲さん。さすがインターフェイスがよく考えてられてます。るびまのインタビューでは

Pathname.new とか書いてるのではその文字列に長さで勝てない。だから pathname はリテラルのシンタックスがほしい。リテラルのシンタックスにすると同じような長さで書けるようになる。
Rubyist Magazine - Rubyist Hotlinks 【第 8 回】 田中哲さん その3

と。なるほどリテラルかぁ。