伊藤と申します。

次のスクリプトの動作が不可解なので質問します。

bash$ ruby -v; cat test.rb; echo "---------"; ./test.rb
ruby 1.4.2 (1999-09-18) [i386-cygwin]
#!/usr/local/ruby/ruby.exe

a = Hash.new([])
b = ['x','y','z']
b.each do |i|
  a[i] = (a[i] << i)
  p a
  p a.default
end
print "#{a['x'].id} #{a['y'].id} #{a['z'].id}\n"

a1 = Hash.new([])
b1 = ['x','y','z']
b1.each do |i|
  a1[i] = (a1[i] << i)
  p a1
  p a1.default
  a1.default = []
end
print "#{a1['x'].id} #{a1['y'].id} #{a1['z'].id}\n"
---------
{"x"=>["x"]}
["x"]
{"y"=>["x", "y"], "x"=>["x", "y"]}
["x", "y"]
{"y"=>["x", "y", "z"], "z"=>["x", "y", "z"], "x"=>["x", "y", "z"]}
["x", "y", "z"]
19650904 19650904 19650904
{"x"=>["x"]}
["x"]
{"y"=>["y"], "x"=>["x"]}
["y"]
{"y"=>["y"], "z"=>["z"], "x"=>["x"]}
["z"]
19649884 19649716 19649572
bash$ 

質問

  (1) Hash のデフォルト値が、new で指定したものでなく、
      最後に行なった代入の値に変化してしまうように
      見えますが、これはそういうものなのでしょうか。

  (2) デフォルト値の設定を行なわない場合、異なるキーに
      関連づけられたオブジェクトがすべて同一になって
      しまいますが、これはそういうものなのでしょうか。

********************
Ito Kazumitsu <ito / htk.hitachi-cable.co.jp>