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