Ventury Networks’ Blog

“If it walks like a duck and quacks like a duck, I would call it a duck.”

Smalltalk et les blocs multi-paramétrés


La problématique est la suivante : comment passer trois paramètres à un bloc, provenant d’une collection (Array, OrderedCollection, ou tout autre …).

monTab := #(1 2 'add').
monBloc := [:op1 :op2 :op3 | duCode. ^unResultat].

Je veux executer monBloc avec le contenu de monTab comme paramètres. L’utilisation de do: n’est ici pas appropriée : do: est un message compris par une collection, pas par un bloc. Et pourtant, la réponse est dans cette réponse : un bloc est un objet, comme tout en smalltalk. Il existe donc un message permettant de donner un paramètre à un bloc. Ce message est value: :

monBloc := [:op1 :op2 :op3 | duCode. ^unResultat].
monBloc value: 1 value: 2 value: 'add'.

Pour obtenir les éléments de monTab, je propose l’utilisation d’un ReadStream. Cependant, un acces direct aux éléments est aussi possible. Voici les deux solutions :

monTab := #(1 2 'add').
monBloc := [:op1 :op2 :op3 | duCode. ^unResultat].
" Accès direct aux éléments "
monBloc value: (monTab first) value: (monTab at: 2) value: (monTab last).
" Une seconde solution : "
monStream := monTab readStream.
monBloc value: monStream next value: monStream next value: monStream next.

Et voilà !

Tags :