Am 04.10.2011 um 13:33 schrieb Mariano Martinez Peck:

> 
> 
> On Tue, Oct 4, 2011 at 1:08 PM, Sven Van Caekenberghe <[email protected]> wrote:
> 
> On 04 Oct 2011, at 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?
> > in which case I need a block instead of the value object directly ?
> 
> You are right, it feels a bit silly.
> However, have a look at the senders (there are many).
> Often the block holds an expensive operation when using the dictionary as a 
> cache:
> 
>        cache at: key ifAbsent: [ backEnd get: key ]
> 
> 
> and what is the difference to do:
> 
> cache at: key ifAbsent: ( backEnd get: key )    (notice the parenthesis 
> instead of []) 
> 
> [500 timesRepeat:[ 
> Dictionary new at: #foo ifAbsentPut: [ CompiledMethod instanceCount ] ]] 
> timeToRun 7254 
> 
> [500 timesRepeat:[ 
> Dictionary new at: #foo ifAbsentPut:  (CompiledMethod instanceCount)  ]] 
> timeToRun 7294  
> 
> gives me more or less the same...
> 
try

| dict |
dict := Dictionary new.
[500 timesRepeat:[ 
dict at: #foo ifAbsentPut: [ CompiledMethod instanceCount ] ]] timeToRun.  21

| dict |
dict := Dictionary new.
[500 timesRepeat:[ 
dict at: #foo ifAbsentPut:  (CompiledMethod instanceCount)  ]] timeToRun  10501

Norbert

Reply via email to