Iteradores
Doggie DaddyIteradores são mensagens que permitem percorrer coleções de objetos efetuando computações a cada elemento obtido.
Collections
Coleções de objetos podem ser estruturadas de várias formas. Para exemplificar usando iteradores vamos no ater às formas literais dos arrays. Mas o ambiente do Pharo Smalltalk possui muitas outras coleções que podem ser usadas no lugar dos arrays com o mesmo efeito.
Duck typing
Smalltalk é uma linguagem dinâmica que usa duck types. Duck types é um termo que faz alusão à frase: "Se grasna, bota ovo e nada como um pato então é um pato". Diferentemente das linguagens fortemente tipadas os "tipos" no Smalltalk são considerados compatíveis quando um objeto consegue responder a um certo número de mensagens em uso num determinado contexto. Duck typing é importante no funcionamento dos iteradores que, assim, podem servir para iterar sobre vários tipos de coleções desde que implementem algumas mensagens em comum.
Iteradores
Os iteradores são uma espécie de loop
confinado a enumerar os elementos de uma coleção.
do
A mensagem do:
é enviada a uma coleção e o seu argumento é um bloco. Cada elemento da coleção é passado para o bloco em cada iteração.
Veja o exemplo abaixo:
collect
A mensagem collect:
é enviada a uma coleção e o seu argumento é um bloco. Cada elemento da coleção é passado para o bloco em cada iteração. O resultado da computação feita em cada bloco é inserido numa nova coleção que é então retornada.
No exemplo abaixo usamos Inspect it
para ver o array resultante:
select
A mensagem select:
é enviada a uma coleção e o seu argumento é um bloco. Cada elemento da coleção é passado para o bloco em cada iteração. O resultado da computação feita em cada bloco deve ser um booleano (true
ou false
). Os elementos passados aos blocos cujo resultado é true
são retornados numa nova coleção. Este iterador atua como um filtro.
No exemplo abaixo usamos Inspect it
para ver o array resultante:
reject
A mensagem reject:
é enviada a uma coleção e o seu argumento é um bloco. Cada elemento da coleção é passado para o bloco em cada iteração. O resultado da computação feita em cada bloco deve ser um booleano (true
ou false
). Os elementos passados aos blocos cujo resultado é false
são retornados numa nova coleção. Este iterador atua como um filtro de forma complementar ao select
. Rejeita o que o select
seleciona.
No exemplo abaixo usamos Inspect it
para ver o array resultante:
detect
A mensagem detect:
é enviada a uma coleção e o seu argumento é um bloco. Cada elemento da coleção é passado para o bloco em cada iteração. O resultado da computação feita em cada bloco deve ser um booleano (true
ou false
). O elemento passado ao primeiro bloco cujo resultado é true
é retornado e a iteração não prossegue. Este iterador atua como uma busca linear pelo primeiro elemento que satisfaça uma condição.
No exemplo abaixo usamos Print it
para ver o resultado:
Encerrando a sessão
Encerre salvando a imagem.