From: Yukihiro Matsumoto Date: 2005-06-08T22:02:18+09:00 Subject: [ruby-list:40860] Re: Ruby without false or nil まつもと ゆきひろです In message "Re: [ruby-list:40857] Re: Ruby without false or nil" on Wed, 8 Jun 2005 20:17:59 +0900, URABE Shyouhei 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の仕様を論じるときに「驚き最小」への言及は 禁止ね(苦笑)。 まつもと ゆきひろ /:|)