Hi.

2017-02-21 9:44 GMT+01:00 Guillermo Polito <guillermopol...@gmail.com>:

> Hi Dr. Dias,
>
> a WeakValueDictionary get's its values collected if they are not
> referenced strongly. However, the association remains there. This means
> that when you do:
>
> dictionary := WeakValueDictionary with: 'hello' -> nil copy.
>
> You'll have something like this:
>
> WeakValueDictionary {
>   WeakValueAssociation { key: 'hello', value: yourObject }
> }
>
> Once you garbage collect, the value is holding yourObject weakly, so
> you'll have:
>
> WeakValueDictionary {
>   WeakValueAssociation { key: 'hello', value: nil }
> }
>
> But the WeakValueAssociation will still be there.
>
>
For me what you describe is implementation details and users should not
think about it at all.
I agree ifAbsent~ messages should work with collected values by "absent
branch". It is intuitive.

To support it correctly we can use approach of Set which uses #asSetElement
to store items. Then we can easily distinguish nil from absent value. Real
nil value will happen only by garbage collection.
But I am wondering WeakSet not uses SetElement approach directly and
instead it uses special flag object. Maybe it should be fixed too.

Reply via email to