つくったLRUHash
私はid:fistfvckさん(ですよね? お名前確認してなかったのでちと不安)と一緒にコードを書きました。仕様はこんな感じ。
Hashぽいインターフェースが欲しいとの要件だったので[]
と[]=
をまずは実装(上2つのexample)、その後100個という最大値を挟んでのLRU的機能を実装してみました。実際のストレージは、ふつうのHashへのdelegateで。継承したペアも多かったんですが、私たちは「コレはis-a Hashじゃなかろう」ということで委譲を使ってみることにしました。Forwardableは凄く便利。
このあたりのテストを書いてみると、LRUぽい機能はと=で何かやれば良さそうだぞ、というのが導出されてきます。また、テストを書いてみると、実際のクライアントとしてはcacheされていてnilなのか、そもそもキャッシュされていないのかを見るためにhas_key?系のメソッドも欲しかろう、ということもわかったので、そっちも委譲しています。
で、プロダクトコードは以下です。もちろんRuby 1.9でテストしています。
https://gist.github.com/133521/82178f453987fff450b9a97ac7e689e0a43e15f0
順序が保持されるHashなんて気持ちわるい、そう考えていた時期が私にもありました。コレはたしかに便利。ビミョウだけど。
その後、プロダクトオーナーであるid:t-wadaさんより「Railsで使いたいので1.8で動かないか』という指摘をいただきました。それをうけて1.8用に書き直したのが以下のコードです。仕様変更だー! ワーン。
例外系とかいろいろ省いていますが、Rubyって簡単に書けていいですね。