Ok. Question was from Martin. What behaviour we want from WeakValueDictionary for garbaged values? dictionary := WeakValueDictionary with: 'hello' -> 'world' copy.
Smalltalk garbageCollect. { dictionary values includes: nil. dictionary at: 'hello'. dictionary at: 'hello' ifAbsent: [ 'absent' ]. dictionary at: 'hello' ifAbsentPut: [ 'put' ]. } is: #(true nil nil nil)
My opinion is: it should work in same way when 'hello' item is absent. It is intuitive for me and It would be consistent to WeakSet behaviour: set := WeakSet with: Object new. Smalltalk garbageCollect. set includes: nil "=>false" But after writing it I realized how much WeakSet is inconsistent: set := WeakSet with: Object new. Smalltalk garbageCollect. set isEmpty. "=>false" set size. "=>1". set anyOne. "=> nil" set includes: nil. "=>false" set collect: #yourself. "=>a WeakSet()" We definitely have something to improve here. 2017-02-21 13:36 GMT+01:00 Guillermo Polito <guillermopolito@gmail.com>:
Everything has a tradeoff. I do not understand the question.
On Tue, Feb 21, 2017 at 1:19 PM, Denis Kudriashov <dionisiydk@gmail.com> wrote:
2017-02-21 13:07 GMT+01:00 Guillermo Polito <guillermopolito@gmail.com>:
But in any case, whatever the alternative you give users, they must understand the tradeoff. If all Weak*Dictionaries were subscribed by default to the weak registry for cleanup, that would provoke a lot of overhead during garbage collection.
So you think my suggestion for implementation will lead to some tradeoff? What exactly? (if yes).