On 04.10.2011 12:52, Mariano Martinez Peck wrote:
Hi guys. If I tell you the selector is Dictionary >> #at:ifAbsentPut:
what would you expect the second parameter to be? the value.
So, one would do:
Dictionary new at: #foo ifAbsentPut: 4
But if you see Dictionary >>
at: key ifAbsentPut: aBlock
"Return the value at the given key.
If key is not included in the receiver store the result
of evaluating aBlock as new value."
^ self at: key ifAbsent: [self at: key put: aBlock value]
so it expects a Block. Ok, we are in Smalltalk, so implementing #value
is enough.
Well..the previous example works, but only because we have an ugly
Object >> value that returns self.
If I put instances of subclasses from ProtoObjects (proxies), that do
not work anymore.
So...my question is we do Dictionary at: #foo put: 4, why
#at:ifAbsentPut: expects a block and not directly the value?
Sven's reasons are correct I think, it's for efficiency, and elegant
lazy initialization of a cache.
The same reasons will never hold true when using #at:put:.
in which case I need a block instead of the value object directly ?
In addition to when you want delayed computation, when you have value
objects who redefine/do not define #value ;)
Cheers,
Henry