まつもと ゆきひろです

In message "[ruby-dev:2762] Re: hash with default value"
    on 98/05/27, toyofuku / juice.or.jp <toyofuku / juice.or.jp> writes:

|  豊福@パパイヤです。

|  いえいえ、これだけメールが多いと覚えてる方が
|大変でしょう。メーリングリスト検索機能(原さん
|のでしたっけ)のおかげで見つけることができま
|した。ありがとうございます。

namazuを使うという案は出てるんですけどね.

|  私が最初に書いたコードはこの delegate版を
|method_missing を使って書いた感じのものに
|なるんですね。本題とはずれますが、このように
|delegate を使ったものと method_missing を
|使ったものとの違いにはどうようなことがあり
|ますか。

method_missingを使ったものは知らないメソッド全部に対して呼ば
れちゃうんで,必要以上に呼ばれることがあるのと,逆に既に知っ
ているメソッド(to_s)とかは明示的に転送してやる必要があります.
そういう意味ではdelegate版の方がいろいろ使い勝手は良いと思い
ます.

|> 後者は特にHashにこれ以上「状態」を持たせることへの抵抗とでも
|> 言ったら良いでしょうか.
|
|  こちらをどうその気にさせればよいかですね・・・

そーですね.オブジェクト指向なんて「状態こそ全て」というのが
本質のはずなんですが,Hashというオブジェクトに直接Hashとは関
わり無い「デフォルト値」という状態を追加することに妙に抵抗が
あるんですよ.考慮しなくてはいけないことが増える(今ならnilが
返って来れば対応する要素が存在しないことが保証されるが,デフォ
ルト値があるとそうはいかない)のが気になってるんだと思います.

|> 今、Hashの[]メソッドに別名として(例えば)fetchを使えるようにし、このメ
|> ソッドがイテレータとしてブロックを受け取れるようにし、これがHashの要素
|> がなかった時に実行されその値が返るとすると、豊福さんが書いておられたハッ
|> シュキーがなかった時のデフォルトが少し簡単に書けます。
|
|  val = hash.fecth("foo") {|key| 25 }
|
|というように書くということでしょうか。値を
|得るときに毎回ブロックを書かないといけないと
|したらいやです。最初に一回初期値を与えたら後
|は何もしたくないですから。

やっぱり,Hashに状態を持たせることにこだわっておいでなのです
ね.うーむ.

|  getitem の方はインタフェースがわからない
|のでまたいつか。

getitemはこんな感じです

   hash.getitem(key, none)

keyに対応する値が無い時にnoneの値が返ります.本質的には一緒
ですね.

|  ただ今回私が言い出した第一の理由は
|「nil + obj」もエラーになった方が気持ち良い
|というものなので、

不評ですね.まあ,しょうがないかな,とも思いますが.

しかし,「nil + obj」をエラーにするためには「デフォルト値の
あるハッシュ」について云々するより,これを無くすという方向で
進べきだと思います.というのも,「デフォルト値のあるハッシュ」
を導入しても,「nil + obj」を使っているスクリプトの修正は避
けられないからです.

まあ,もしデフォルト値のあるハッシュがあった方が修正は少なく
て済むでしょうが.どうせ修正するなら五十歩百歩ですからね.

|  ハッシュのことばかり書いてますが初期値
|を持った配列も同様に考えてます。

うーん,これも同様の理由で抵抗があります.こっちはハッシュよ
りももっと実装上の都合が悪いと言うことを別にしても.

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