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からの相対パスが格納される。素晴らしい。