新井です。

In message "[ruby-dev:16689] Re: ライブラリ拡大計画"
  on 31 Mar 2002 17:00:13 +0900,
  WATANABE Hirofumi <eban / os.rim.or.jp> wrote:
> わたなべです。
> 
> Yukihiro Matsumoto <matz / ruby-lang.org> writes:
> 
> :|削除とはちょっと違うんですが、
> :|個人的にはdbmがところに依って、ndbmだったりgdbmだったり
> :|BerkeleyDBだったりするのがちょと使い辛いです。
> :|OSを上げたら、いつのまにかndbm互換ライブラリが、
> :|gdbmからBerkeleyDBに変更されてたりするので。
> :|
> :|というわけでdbmはsdbmを使うというのはどうでしょう?
> :|gdbmやBerkeleyDBが使いたいなら別にありますし、
> :|OSに付属のndbmを使いたいという人はあまりいないと思うし。
> :
> :現状のdbmをndbmにするのはどうでしょう?
> :gdbm対応とかは取り除いて。
> 
> これはndbmはgdbmやBerkeley DBの互換インターフェースは使わないという意味?
> libcに含まれる*BSDはそのままでいいということかな。
> となるとLinuxではndbm拡張ライブラリは存在しないことになりそう。
> #本物のndbmを取ってくれば別だけど。

その前に以下の仕様はどうあるべきかが曖昧なようです。

    require 'dbm'
    require 'sdbm'
    require 'gdbm'

    for c in [DBM, SDBM, GDBM]
      puts "--" + c.to_s + "--"
      STDOUT.flush
      dbm = c.open("/tmp/hoge")
      dbm["foo"] = nil rescue nil
      p dbm["foo"]
    end

    ruby 1.7.2 (2002-03-29) [i586-linux]
    --DBM--
    ""
    --SDBM--
    nil
    --GDBM--
    Exception `TypeError' at -:8 - failed to convert nil into String
    nil

つまり、nil の代入に関して

    DBM は、空文字列の代入
    SDBM は、要素の削除(昔のHashと同じ)
    GDBM は、TypeError

となっています。(私がSDBM以外をいじったかも^^;)
できればいずれかに決めていただけますでしょうか?

--
新井康司 (Koji Arai)