From: gotoken@... (GOTO Kentaro) Date: 2000-12-16T23:11:47+09:00 Subject: [ruby-list:26555] Re: Hash.new ごとけんです In message "[ruby-list:26554] Hash.new" on 00/12/16, Takao KAWAMURA writes: >h = Hash.new([]) >h[0] << 0 >h[0] << 1 >p h # <= {} どうして? 現象としては、Hash#default が指すオブジェクトだけが変更され ています。 h = Hash.new([]) h[0] << 9 p h[0] #=> [9] p h.default #=> [9] つまり、Hash.new の引数は「Hash#[]= では登録されていないデフォ ルトのオブジェクト」を与えるものです。 >h = Hash.new([]) >h[0] += [0] >h[0] += [1] >p h # <= {0=>[0, 1]} 期待通り こちらは、h[0] += [0] が h[0] = h[0] + [0] と等価で、なおか つ、h[0] = h.default + [0] とも等価なため、[]= で登録するこ とになるので上記の結果を与える上にデフォルトを変更しません。 >a = Array.new(1,[]) >a[0] << 0 >a[0] << 1 >p a # <= [[0, 1]] 期待通り > >を試すと、これも期待通り。 Array.new(n,obj) はn個のobjを持つ配列を返すので、Hash.new(obj) とはだいぶ異なります。 個人的にはHashのdefaultが設定されている場合は、Hash#[] で参 照したキーに対して代入するように変更して欲しいと思います。 それと何度か話題に上がっている「Hash.newにブロックを与えたら、 defaultはそれを評価して返す」というのも採用されないかなぁ。 -- gotoken