Hi.

2017-02-21 9:44 GMT+01:00 Guillermo Polito <guillermopolito@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.