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.
Vamos abordar os principais:
- do
- collect
- select
- reject
- detect
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:
Note o uso da mensagem binária >>> para indicar o resultado de uma expressão. É uma forma alternativa usada para isso em vez de usar Print it. A execução de >>> retorna uma Association. A única coisa que precisa saber agora sobre uma Association é que ela é composta de uma key e um value.
Alguns exemplos:
A expressão 5 factorial >>> 120 retorna uma Associaton 120 -> 120 onde key vale 120 e value vale 120.
A expressão 9 sqrt >>> 2 retorna uma Associaton 3 -> 2 onde key vale 3 e value vale 2.
A expressão (42 >>> 'The Answer') >>> (42 -> 'The Answer') auto-descreve >>>.
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.
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.
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.
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.
Encerrando a sessão
Encerre salvando a imagem.