Dir.glob を Shift_JIS でも動くようにする

こんなんでいけた。
ただ、ruby 1.8.3 以降だと必要ないとかって噂もある。使ってないから判らないけど。


ruby で defadvice とか aspect っぽい事をやるにはこうすればいいのね。
Module.method で symbol-function みたいに元の定義を取っておいて、上書きすると。

class Dir
  # 元の glob メソッドを取っておく
  @@orig_glob_method = self.method(:glob)

  # Shift_JIS を考慮した glob に変更
  def self.glob(pattern, flags = 0, &block) 
    new_pattern = ""
    pattern.each_char {|c|
      # Shift_JIS の文字だったときに、glob のワイルドカードにひっかかるものをエスケープする
      if c.mbchar?
        c.each_byte {|b| new_pattern << b.chr.sub(/[?{}\[\]]/, '\\' + b.chr)}
      else
        new_pattern << c
      end
    }

    # 差し替えた pattern で元の glob を呼ぶ
    @@orig_glob_method.call(new_pattern, flags, &block)
  end
end