まつもと ゆきひろです

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

|  豊福@パパイヤです。

|  なかなか見つからないと思ってたら ruby-list
|の方でした。(ruby-list:7372 - 7375)

どうもすいませんでした.

|> その時に,必要であればdelegate.rbを使って作れば良いじゃない
|> かというような話があったような,なかったような….
|
|  delegate の話はまだ出てないようです。(これ
|からでも聞きたいですが)

こんな感じです.いきなりコードで恐縮ですが.

  require 'delegate'
  class DefaultHash<SimpleDelegator
    def initialize(default, hash={})
      @default=default
      @hash = hash
      super(hash)
    end
    def [](key)
      unless @hash.key? key
        @default
      else
        @hash[key]
      end
    end
  end

  dhash = DefaultHash.new(25)
  dhash["foo"]  # => 25

ここでdhashはHashの全てのメソッドを理解するので,ほとんどあ
らゆる場所でHashの代わりをします.かつ,豊福さんの望み通りデ
フォルト値を持ちます.

|> 実装の都合になっちゃいますが,RHash構造体にはデフォ
|> ルト値をいれるすき間が残ってないんですよ.
|
|  上に書いたような st_table の方でもダメですか。

うーん,st_tableに追加,ですか….

気になるのは,st_tableはrubyの実装の中でhash tableが必要なあ
らゆる場所に使われているので,そーゆーrubyのHashのためだけに
機能を追加することに抵抗があることと,Hashのデフォルト値とい
う考えがあんまり気に入ってないことの両方です.

後者は特にHashにこれ以上「状態」を持たせることへの抵抗とでも
言ったら良いでしょうか.

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

こちらの考えにはそれほど抵抗が無いんですよねえ.

|だったら if分岐がちょっと増えるだけのような
|気がするのですが。

st_tableを使えば,実装上の問題はもうそれほど残ってないですね.

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