From: pete@... (Pete Goodeve) Date: 2006-03-15T16:08:46+09:00 Subject: Hash default -- what's going on here? I've hit what is either an egregious bug in ruby (1.8.4) or some subtlety that I haven't grasped. [Most likely the latter... (:-)] Briefly I had two arrays of symbol strings of which I wanted to find which symbols occurred in both arrays, so I thought I'd use a hash with the key being the symbol and the value a two element array that would be used to flag which set(s) the symbol was found in. The following is a simplified (and 'instrumented') version of what I was trying to do: listA=["line1","line2","line3"] listB=["line5","line3","line4"] table={} table.default=[0,0] print "table default originally: ", table.default, "\n" listA.each {|a| t=table[a]; print a," -- undef value: ",t; t[0]=1; print " new value: ",t,"\n"; table[a]=t} print "table default now: ", table.default, "\n" listB.each {|a| t=table[a]; print a," -- undef value: ",t; t[1]=1; print " new value: ",t,"\n"; table[a]=t} print "table default now: ", table.default, "\ntable contents:\n" table.each {|k,v| print k, ": ", v[0], v[1], "\n"} Now, in the 'each' statements, the variable 'a' should (except in one case) not be in the hash yet, so I would expect the original provided default to be returned. However, here's the printout I get: table default now: 00 line1 -- undef value: 00 new value: 10 line2 -- undef value: 10 new value: 10 line3 -- undef value: 10 new value: 10 table default now: 10 line5 -- undef value: 10 new value: 11 line3 -- undef value: 11 new value: 11 line4 -- undef value: 11 new value: 11 table default now: 11 table contents: line1: 11 line2: 11 line3: 11 line4: 11 line5: 11 Dunhh? Why is the default value getting changed? I can't see that I'm resetting it anywhere. If I do the same sort of manipulations outside of a block (one at a time in irb for instance) things happen as I would expect -- the default remains as set, and is returned for any undefined key. Illumination appreciated. -- Pete --