Skip to content

Commit 14db0cc

Browse files
committed
Tutorials - Translation PT-BR - Automatic Closures
1 parent 866439c commit 14db0cc

File tree

1 file changed

+72
-0
lines changed

1 file changed

+72
-0
lines changed
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
---
2+
layout: tutorial
3+
title: Automatic Type-Dependent Closure Construction
4+
5+
disqus: true
6+
7+
tutorial: scala-tour
8+
num: 30
9+
tutorial-next: annotations
10+
tutorial-previous: operators
11+
language: pt-br
12+
---
13+
14+
O Scala permite nomes de funções sem parâmetros como parâmetros de métodos. Quando um tal método é chamado, os parâmetros reais para nomes de função sem parâmetros não são avaliados e uma função nula é passada em vez disso, tal função encapsula a computação do parâmetro correspondente (isso é conhecido por avaliação *call-by-name*).
15+
16+
O código a seguir demonstra esse mecanismo:
17+
18+
```tut
19+
object TargetTest1 extends App {
20+
def whileLoop(cond: => Boolean)(body: => Unit): Unit =
21+
if (cond) {
22+
body
23+
whileLoop(cond)(body)
24+
}
25+
var i = 10
26+
whileLoop (i > 0) {
27+
println(i)
28+
i -= 1
29+
}
30+
}
31+
```
32+
33+
A função `whileLoop` tem dois parâmetros `cond` e `body`. Quando a função é aplicada, os parâmetros reais não são avaliados. Mas sempre que os parâmetros formais são usados no corpo de `whileLoop`, as funções nulas criadas implicitamente serão avaliadas em seu lugar. Assim, o nosso método `whileLoop` implementa um while-loop Java-like com um esquema de implementação recursiva.
34+
35+
Podemos combinar o uso de [operadores infix/postfix](operators.html) com este mecanismo para criar declarações mais complexas (com uma sintaxe agradável).
36+
37+
Aqui está a implementação de uma instrução que executa loop ao menos que uma condição seja satisfeita:
38+
39+
```tut
40+
object TargetTest2 extends App {
41+
def loop(body: => Unit): LoopUnlessCond =
42+
new LoopUnlessCond(body)
43+
protected class LoopUnlessCond(body: => Unit) {
44+
def unless(cond: => Boolean) {
45+
body
46+
if (!cond) unless(cond)
47+
}
48+
}
49+
var i = 10
50+
loop {
51+
println("i = " + i)
52+
i -= 1
53+
} unless (i == 0)
54+
}
55+
```
56+
57+
A função `loop` apenas aceita um corpo de um loop e retorna uma instância da classe` LoopUnlessCond` (que encapsula este objeto de corpo). Note que o corpo ainda não foi avaliado. A classe `LoopUnlessCond` tem um método `unless` que podemos usar como um *operador infix*. Dessa forma, obtemos uma sintaxe bastante natural para nosso novo loop: `loop { <stats> } unless ( <cond> )`.
58+
59+
Aqui está a saída de quando o `TargetTest2` é executado:
60+
61+
```
62+
i = 10
63+
i = 9
64+
i = 8
65+
i = 7
66+
i = 6
67+
i = 5
68+
i = 4
69+
i = 3
70+
i = 2
71+
i = 1
72+
```

0 commit comments

Comments
 (0)