domingo, 11 de abril de 2010

Coleções com Smalltalk

Smalltalk Dando seguimento a uma série de artigos sobre GNU Smalltalk, este artigo demonstra alguns recursos de coleção (arrays e dicionários).

A classe base para coleções é Collection, filha de Iterable. As demais classes, como Array, Dictionary, Bag e Set, são herdeiras diretas ou indiretas de Collection.

Para criar um instância vazia de qualquer subclasse de Collection, você pode usar a mensagem #new.

Array


Há duas sintaxes para instanciação de Array, uma literal e outra programável.

A sintaxe literal suporta apenas dados literais: inicia-se com #(, os elementos são separados por blanks (espaços, tabulações, mudanças de linha) e é fechado com ).

Por exemplo:
#(1 2 3)


A limitação dessa sintaxe é que ela só suporta valores literais, não suporta qualquer forma de código (bloco, variável, construtor, etc…). Portanto, não é recomendável.

A sintaxe recomendada para criação de array com código é {}, pois a sintaxe literal suporta apenas literais. A sintaxe com suporte a código se inicia com {, os elementos são separados por ponto (.) seguido de blank e é fechado por }.

Por exemplo:
| anArray b |

b := 2.
anArray := {
1.
b.
[3] value.
}.


O principal seletor para leitura de elementos em um array é #at:ifAbsent:, que recebe como primeiro parâmetro o índice e como segundo um bloco que retorna o valor em caso se ausência.

Por exemplo:
anArray at: 2 ifAbsent: [0]


Retorna o elemento de índice 2 ou, em caso de não existir, retorna zero ([0] value).

Dictionary


Essa classe representa um dicionário ou hash, ou seja, uma coleção de pares chave-valor.

Por exemplo:
| aDict |

aDict := Dictionary from: {
#a -> 1.
#b -> 2.
#c -> 3.
}.


Se usar Squeak ou Pharo, a mensagem de criação é #newFrom: em vez de #from:.

Também aceita a mensagem #at:ifAbsent:, que recebe como primeiro parâmetro a chave e como segundo um bloco que retorna o valor em caso de ausência. Ainda responde à mensagem #at:, que recebe apenas a chave e, em caso de ausência, levanta uma exceção NotFound.

A mensagem para inserir um novo par é #add::
aDict add: (#d -> 4).


Para alterar o valor de uma chave use #at:put::
aDict at: #a put: 5.


Também funciona para adicionar novo par.

Para remover um par pela chave basta usar a mensagem #removeKey::
aDict removeKey: #a.


À mensagem #keys responde uma lista – uma instância de Set, de fato – das chaves dos pares, já o seletor #keysAndValuesDo: executa um bloco para cada par:
aDict keysAndValuesDo: [ :key :value |
Transcript
show: key printString;
tab;
show: value printString;
cr.
].


Set


Set é um array onde cada elemento é único, ou seja, não se repete. Para criar uma instância de Set:
| aSet |

aSet := #(1 2 3 4 5) asSet.


Para remover um elemento, use a mensagem #remove: e para adicionar #add:. Se o elemento adicionado já existir, nada acontece.

Para listar o conteúdo há a mensagem #do::
aSet do: [ :e |
Transcript show: e printString; cr.
].


Bag


Bag é exatamente o que o nome diz: um saco de elementos. Você pode ir jogando o que quiser lá dentro e os elementos vão sendo armazenados desordenadamente.
| aBag |

aBag := #(1 2 3 4 5) asBag.


Os principais seletores são #add:, #remove: e #do:, que funcionam de modo similar aos seletores de Set, mas permite duplicação de elementos.

Conclusão


Há uma série de outras classes filhas de Collection, como OrderedCollection, SortedCollection e LinkedList, e muitos outros seletores úteis.

Para mais informações, execute gst-blox, acesse SmalltalkClass Hierarchy Browser. Na nova janela, clique em ClassSearch e faça uma busca por Collection.

De classe em classe, navegue pelos métodos e veja como cada classe responde a cada mensagem.

[]’s
Cacilhας, La Batalema


PS: Referência: M206 Computing: An Object-oriented Approach
blog comments powered by Disqus