新井です。

In message "[ruby-list:36498] Re: cacheout.rb"
  on 17 Nov 2002 06:29:18 +0900,
  "Yoshinori K. Okuji" <okuji / enbug.org> wrote:
> あれはあんまりインターフェースが練れてないので、もうちょっと改善しなく
> てはと思いつつ、放置してました。本当はRuby/Cache側を改造すれば、もう少
> しきれいに書けそうですが、試しにRuby/Cacheベースで書き直してみました。
> 参考になれば幸いです。

おお、なかなかシンプルになりますね。

ただ、どうも ruby-1.7 だと freeze したファイルへの出力は例外
になる(いつのまに?)ようで、そのままでは使えないようです。

    f = File.open("/tmp/foobar", "w").freeze
    f.puts "foo"

    => ruby 1.6.7 (2002-03-01) [i586-linux]

    => -:2:in `write': can't modify frozen File (TypeError)
	    from -:2:in `puts'
	    from -:2
       ruby 1.7.3 (2002-11-14) [i586-linux]

Proc#yield のために 1.6 で使えないのももったいないのでパッチ


diff -ru ruby-cache-0.1/lib/cache.rb ruby-cache-0.1.fix/lib/cache.rb --- ruby-cache-0.1/lib/cache.rb 2002-08-23 14:27:42.000000000 +0900 +++ ruby-cache-0.1.fix/lib/cache.rb 2002-11-17 07:23:36.000000000 +0900 @@ -58,7 +58,11 @@ obj = @objs[key] if @hook - @hook.yield(key, obj) + if @hook.respond_to? :yield + @hook.yield(key, obj) + else + @hook.call(key, obj) + end end @size -= obj.size @@ -83,7 +87,7 @@ @list.clear @size = 0 end - alias :clear, :invalidate_all + alias :clear :invalidate_all def expire() if @expiration @@ -131,8 +135,6 @@ self.invalidate(key) end - obj.freeze - size = obj.to_s.size if @max_obj_size and @max_obj_size < size if $DEBUG -- 新井康司 (Koji Arai)