martes, agosto 16, 2005

La magia del Smalltalk: Capítulo 9 - Colecciones

Pocas cosas tienen un impacto tan grande en la productividad en el desarrollo de software como el manejo de colecciones. Cualquier lenguaje/ambiente de programación que se precie de serio incluye algún framework para el manejo de colecciones.

La combinación de los bloques como objeto de pleno derecho por un lado, el late binding extremo que predica el Smalltalk y el hecho de tener más de 30 años de maduración hacen de las colecciones de Smalltalk uno de los frameworks más poderosos en esta área.

Para empezar veamos el mensaje básico para las colecciones: do:. El mensaje do: le pide a una determinada colección que evalúe un bloque dado por cada elemento que contiene.

'Un string es, obviamente, una colección'
    do: [:each | Transcript show: each; cr]


#(1 2 3 4 5 6 7 8 9 10)
    do: [:each | Transcript show: each; cr]



Veamos algunos mensajes más:

#do:separatedBy:
Evalúa un bloque dado por cada elemento, y evalúa el otro bloque dado entre elementos.
#(1 2 3 4 5 6 7 8 9 10)
    do: [:each | Transcript show: each]
    separatedBy: [Transcript show: ',']


#select:
Devuelve una colección, del mismo tipo que la colección receptora del mensaje, con los elementos para los que el bloque dado devuelve true.
#(1 2 3 4 5 6 7 8 9 10) select: [:each | each odd]
respuesta: #(1 3 5 7 9)


#reject:
Similar a #select:, pero devuelve una colección con los elementos donde el bloque devuelve false.
#(1 2 3 4 5 6 7 8 9 10) reject: [:each | each odd]
respuesta: #(2 4 6 8 10)


#collect:
Devuelve una colección, del mismo tipo que la colección receptora del mensaje, con elementos que son el resultado de la evaluación del bloque por cada elemento del receptor.
#(1 2 3 4 5 6 7 8 9 10) collect: [:each | each * 2]
respuesta: #(2 4 6 8 10 12 14 16 18 20)



¡A coleccionar!