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 Smalltalk→Class Hierarchy Browser. Na nova janela, clique em Class→Search 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
CC-BY: Os textos deste blog podem ser reporduzidos contanto que sejam informados autor e origem.