On Fri, 30 Jul 2010, Vaidotas Didžbalis wrote:
Hello,
Item "disappears" in Bag after contents of the item changes. Item is container with equality and hash is overridden. Is this a Bug?
No it's not. Since the return value of AKContainer >> #hash and AKContainer >> #= depend on 'value', they will change if you change the 'value'. Hashed collections assume that the hash and equality of the contained objects don't change.
bag:= Bag with: (val := AKContainer value: 'a'). val value: 'b'. bag valuesAndCounts includesKey: val. "false in Trunk,"
set:= Set with: (val := AKContainer value: 'a'). val value: 'b'. set includes: val. "true"
That happens, because String >> #hash doesn't work well with 5: ($a to: $z) collect: [ :each | each asString hash \ 5 ] as: Set "===> a Set(4)" Most of the time it's expected to return false.
dictionary:= Dictionary newFromPairs: {val := AKContainer value: 'a'. 1}. val value: 'b'. dictionary includesKey: val. "true"
Same as above.
All tests fails in Squeak 3.6 and in Dolphin ST. In Trunk fails only the Bag.
So it's just bad luck that these don't fail in Squeak trunk.
Levente
If this is not a bug, how can I escape this Anomaly of disappearing element [1] Thank you Vaidotas
[1] http://books.google.lt/books?id=W8_Une9cbbgC&pg=PA76&lpg=PA76&dq...