Dir.chdirはブロックを渡して一時的にpwdを変えられる。
Rubyは、こうできたらいいのに、と思ったことが当たり前のように出来たりして嬉しい。
例えば、あるディレクトリ以下のエントリーを再帰的に取得する場合。
Dir.glob(dir + "/**/*")とするのが間違っている気がして、何で引数を2つ取ってDir.glob(dir, "**/*")じゃないんだろうと思っていた。パスの文字列操作が嫌だ。特に先頭のスラッシュが恐ろしい。
かと言って、Pathnameを使ってDir.glob(Pathname.new(dir) + "**/*")とするのも違う感じがする。"**/*"はパスじゃないし。
これは、ブロック付きのDir.chdirを使って以下のように書くのが良いんだと思う。
def traverse_dir(dir) result = [] Dir.chdir(dir) do Dir.glob("**/*") do |f| result << f end end return result end
あるいはもっと短く、
def traverse_dir(dir) return Dir.chdir(dir) { Dir.glob("**/*") } end
結果にはdirからの相対パスが格納される。素晴らしい。