binary selectors ambiguity and space
nicolas cellier
ncellier at ifrance.com
Wed May 17 17:10:41 UTC 2006
Le Mercredi 17 Mai 2006 18:36, Duncan Mak a écrit :
> On 5/17/06, Hans-Martin Mosner <hmm at heeg.de> wrote:
> > The second one is not possible with Smalltalk's semantics. Messages are
> > sent to objects, not to variables. So whatever message you send to
> > variable x, it can't cause x to point to another object (with the
> > exception of #become: but that's a special case). Since numeric objects
> > are immutable, you need to have the assignment x := x+1 either
> > implicitly or explicitly somewhere.
>
> I was thinking of using become: to implement something like this, yeah.
>
become: Cannot work on Integer, and beware of side effects, value will change
also for every object pointing on it...
You can simulate this count++ like with an indirection (a special ValueHolder
subclass Counter) send the #increment message or whatever to the Counter, and
then retrieve its value, but i don't know if this is interesting, apart
sharing a common value between multiple objects
counter := Counter new.
names do: [:each | each startsWith: 'a' ifTrue: [count increment]].
^counter value
> It is true that
>
> names select: [:each | each startsWith: 'a'] size
>
> is more elegant than something like:
>
> names do: [:each | each startsWith: 'a' ifTrue: [count := count + 1]
>
And
names count: [:each | each startsWith: 'a']
is even more efficient (does not create a copy of the collection)
> but what if you want to count multiple conditions in a single iteration?
>
> Duncan.
Nicolas
More information about the Squeak-dev
mailing list
|