Blocos

Blocos

Doggie Daddy

Índice das lições


Blocos são como funções ou métodos anônimos.

Imagine a função square que na notação matemática poderia ficar assim: square(x).

O nome da função é square. O seu argumento vai entre parênteses.

O cálculo seria pela expressão x * x. Podemos escrever na matemática algo como square(x) = x * x.

Imagine agora descrever a função sem dar um nome a ela mas apenas descrever os argumentos e os cálculos em função dos argumentos. Ficaria assim: (x) = x * x. No Smalltalk temos como expressar isto usando blocos: [ :x | x * x ].

Anatomia de um bloco

Blocos são delimitados por [ e ].

Blocos tem duas partes: argumentos (se houver) e corpo separados por |.

Abaixo vemos no Playground exemplos de blocos.

Realce uma das expressões e tente obter o resultado com Print it.

Exemplos de blocos

Como avaliar um bloco

No exemplo anterior as suas tentativas de avaliar um bloco devem ter sido infrutíferas. Na verdade você não pode obter o resultado de uma função sem informar os argumentos. O mesmo se dá com os blocos. Embora haja blocos sem argumentos mas mesmo assim você tem que informar isto.

Os blocos são objetos que guardam código para serem executados no futuro quando receberem a mensagem unária value, justamente quando não precisa de um argumento, ou mensagem com palavras-chaves tais como value:value: se o bloco precisar de dois argumentos.

No Playground abaixo são mostrados blocos imediatamente avaliados com mensagens valuevalue: e value:value:.

Você pode ter até 4 argumentos que podem ser passados com value:value:value:value:. Para mais argumentos há outra forma de passá-los.
Avaliando blocos
Se um bloco contiver mais de uma mensagem a avaliação do bloco retornará o resultado da última expressão do bloco.
Exemplo:
[ 2 + 3. 6 * 7 ] value >>> 42.
A útima mensagem ou expressão é 6 * 7 fazendo com que a avaliação retorne 42, que é o resultado da última expressão.

Atribuindo blocos a variáveis

Você pode atribuir um bloco a uma variável e enviar uma mensagem a esta variável como se estivesse enviando uma mensagem ao bloco.


Na verdade quaquer variável que já esteja atribuida com um objeto pode receber as mesmas mensagens que o objeto receberia e responder a elas. Esta é a forma de guardar referências a um objeto que será usado depois e não se aplica somente aos blocos. A expressão de atribuição é da forma: variable := anObject ou variable := expression, onde a variable passa a referenciar o objeto que é o retorno da expressão..
Atribuindo blocos a variáveis

Blocos podem ter variáveis locais

Um bloco pode ter, além dos parâmetros para receber os argumentos, variáveis locais (temporary).

No script abaixo x2 e y2 são variáveis locais. Só tem existência dentro do bloco. As variáveis locais são declaradas entre |.


Encerrando

Encerre salvando a imagem.




Report Page