From: Robert Klemme Date: 2004-04-28T21:09:02+09:00 Subject: Re: Array#hash bug? "Mark Hubbart" schrieb im Newsbeitrag news:DB14CDD9-98EE-11D8-9038-000502FDD5CC@mac.com... > > On Apr 28, 2004, at 1:04 AM, Robert Klemme wrote: > > > > > "Mark Hubbart" schrieb im Newsbeitrag > > news:56EB0554-986E-11D8-9038-000502FDD5CC@mac.com... > >> Hi, > >> I was messing around with recursive arrays and I came across this: > >> > >> mark@imac% cat hash.rb > >> a = [] > >> a[0] = a > >> puts a.hash > >> mark@imac% ruby -v hash.rb > >> ruby 1.9.0 (2004-04-11) [powerpc-darwin] > >> hash.rb:3:in `hash': stack level too deep (SystemStackError) > >> from hash.rb:3:in `hash' > >> from hash.rb:3:in `hash' > >> from hash.rb:3:in `hash' > >> from hash.rb:3:in `hash' > >> from hash.rb:3:in `hash' > >> from hash.rb:3:in `hash' > >> from hash.rb:3:in `hash' > >> from hash.rb:3:in `hash' > >> ... 44888 levels... > >> from hash.rb:3:in `hash' > >> from hash.rb:3:in `hash' > >> from hash.rb:3:in `hash' > >> from hash.rb:3 > >> > >> .. looks like a bug? > > > > Hm, I'd say that for efficiency reasons loop detection in object > > graphs of > > arrays is not done and thus it's a bug you'll have to live with. After > > all, how often do you need self referencing containers? > > Apparently if I *do* need self referencing arrays, I can't use #hash on > them. Unless I redefine it so it works properly. Yes. But do you need them? And if so, to which end? > Anyway, I realized that the documentation for Array#hash is messed up. > It claims (or at least implies) that #eql? uses #hash to compare > values. I was assuming that a bug in #hash would make comparisons mess > up. I was wrong :) > > irb(main):047:0> [1].eql? [2,1] > => false > irb(main):048:0> [1].hash == [2,1].hash > => true > > hashes are definitely not unique :) That's the nature of hash values. Always was. :-) robert