From: matz@... (Yukihiro Matsumoto) Date: 1998-05-27T17:52:55+09:00 Subject: [ruby-dev:2767] Re: hash with default value まつもと ゆきひろです In message "[ruby-dev:2762] Re: hash with default value" on 98/05/27, 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」を使っているスクリプトの修正は避 けられないからです. まあ,もしデフォルト値のあるハッシュがあった方が修正は少なく て済むでしょうが.どうせ修正するなら五十歩百歩ですからね. | ハッシュのことばかり書いてますが初期値 |を持った配列も同様に考えてます。 うーん,これも同様の理由で抵抗があります.こっちはハッシュよ りももっと実装上の都合が悪いと言うことを別にしても. まつもと ゆきひろ /:|)