豊福@パパイヤです。

まつもとさん
>|  なかなか見つからないと思ってたら ruby-list
>|の方でした。(ruby-list:7372 - 7375)
> どうもすいませんでした.

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

>|  delegate の話はまだ出てないようです。(これ
>|からでも聞きたいですが)
> 
>   require 'delegate'
>   class DefaultHash<SimpleDelegator
  ...
> ここでdhashはHashの全てのメソッドを理解するので,ほとんどあ
> らゆる場所でHashの代わりをします.かつ,豊福さんの望み通りデ
> フォルト値を持ちます.

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

> うーん,st_tableに追加,ですか….
> 気になるのは,st_tableはrubyの実装の中でhash tableが必要なあ
> らゆる場所に使われているので,そーゆーrubyのHashのためだけに
> 機能を追加することに抵抗があることと,

  こちらは使わなければ NULL にしておくだけ
でしょうから、ちょっとやだなくらいですみそう
に思うのですが、

> Hashのデフォルト値とい
> う考えがあんまり気に入ってないことの両方です.
> 後者は特にHashにこれ以上「状態」を持たせることへの抵抗とでも
> 言ったら良いでしょうか.

  こちらをどうその気にさせればよいかですね・・・

> たとえば,稲葉さんが[ruby-dev:2746]で述べておられるような,
> 要素が見つからなければ指定した値を返すメソッド(fetchとか
> getitemとか)についてはどう思われますか?

稲葉さん
> 今、Hashの[]メソッドに別名として(例えば)fetchを使えるようにし、このメ
> ソッドがイテレータとしてブロックを受け取れるようにし、これがHashの要素
> がなかった時に実行されその値が返るとすると、豊福さんが書いておられたハッ
> シュキーがなかった時のデフォルトが少し簡単に書けます。

  val = hash.fecth("foo") {|key| 25 }

というように書くということでしょうか。値を
得るときに毎回ブロックを書かないといけないと
したらいやです。最初に一回初期値を与えたら後
は何もしたくないですから。
  初期値とは違う意味で使うのだったらよいかも
しれません。
  getitem の方はインタフェースがわからない
のでまたいつか。

  ただ今回私が言い出した第一の理由は
「nil + obj」もエラーになった方が気持ち良い
というものなので、上の DefaultHash でも
fetch でも if (hash(key) == nil) then 0;
else hash(key); でもどれでも構いませんから
みんながそれを使ってくれて obj == nil + obj
を必要としなくなればよい(でもできれば初期
値を持ったハッシュで実現されるのがいいかなあ)
という立場です。

  ハッシュのことばかり書いてますが初期値
を持った配列も同様に考えてます。
---
			豊福@パパイヤ
			unbound / papaya.juice.or.jp
			toyofuku / juice.or.jp