まつもと ゆきひろです

In message "Re: [ruby-list:40857] Re: Ruby without false or nil"
    on Wed, 8 Jun 2005 20:17:59 +0900, URABE Shyouhei <s-urabe / par.odn.ne.jp> writes:

|>"恋するプログラム"からの受け売りですが、例えばString#indexで該当文字列が
|>見付からなかった時にnilが返るので、部分文字列の有無だけを判定するのにnil
|>が"偽"だと便利ではあります。
|
|String#indexがfalseを返したとしても成り立つ議論です。

理屈では確かにそうですが、しかし、indexが真偽値を返すという
のになにか違和感を感じるのは私だけでは無いと思います。まあ、
慣れの問題かもしれませんが。

|falseが戻ってきてもいいと思いませんか。

思いませんねえ。なんでだろう。Rubyでは一貫して真偽値を返すも
のはtrue/false、任意の値と未定義(or 非存在)を表す場合にはnil
というルールが確立している(確立させようとしている)せいかもし
れません。

|ところがこの変化に追従していないやつとかもいるわけで、代表格はENVと
|PStoreですが、こいつらに値としてnilを持たせようとして
|env_or_pstore["hoge"] = nil
|とかやると、なんとキー"hoge"が消えてしまう。これは当初は非常に合理的な仕
|様であったと思いますが、現在では驚き最小ではない仕様といえます。

ENVは文字列しか値を取りませんから、nilに対する挙動はエラーか
削除かどちらかしかないと思います。エラーにして方が良かったか
な。PStoreはnilに対応してると思うんですが。

  db=PStore.new("/tmp/foo")
  db.transaction{db["root"]=5}
  db.transaction{
    p db["root"]
    p db.roots
    db["root"]=nil
  }
  db.transaction{
    p db.roots
    p db["root"]
  }

|このように、「該当要素がないとnil」という前提はすでに崩壊していて、しか
|もへんにこの前提を捨て切れていないので、nilがかえるというのがあまり便利
|であるとは思えません。

そうかなあ。崩壊しているというほど崩壊していないと思うんです
が。HashやArrayは値が存在しないときに(少なくともデフォルトで
は)nilを返しますし、indexにしたってdefined?にしたって未定義
に対してnilを返してます。

あ、そうそう。Rubyの仕様を論じるときに「驚き最小」への言及は
禁止ね(苦笑)。

                                まつもと ゆきひろ /:|)