Skip to content

Commit 593b1d3

Browse files
Merge pull request #649 from fforbeck/translation-pt-br
Tour of Scala translated to pt-BR
2 parents b726731 + f843b31 commit 593b1d3

33 files changed

+2058
-0
lines changed
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
---
2+
layout: tutorial
3+
title: Tipos Abstratos
4+
5+
disqus: true
6+
7+
tutorial: scala-tour
8+
num: 22
9+
tutorial-next: compound-types
10+
tutorial-previous: inner-classes
11+
language: pt-br
12+
---
13+
14+
Em Scala, as classes são parametrizadas com valores (os parâmetros de construtor) e com tipos (se as [classes genéricas](generic-classes.html)). Por razões de regularidade, só não é possível ter valores como membros de um objeto; tipos juntamente com valores são membros de objetos. Além disso, ambas as formas de membros podem ser concretas e abstratas.
15+
16+
Aqui está um exemplo que mostra uma definição de valor diferido e uma definição de tipo abstrato como membros de uma [trait](traits.html) chamada `Buffer`.
17+
18+
```tut
19+
trait Buffer {
20+
type T
21+
val element: T
22+
}
23+
```
24+
25+
*Tipos Abstratos* são tipos cuja identidade não é precisamente conhecida. No exemplo acima, só sabemos que cada objeto da classe `Buffer` tem um membro de tipo `T`, mas a definição de classe `Buffer` não revela a qual tipo concreto o membro do tipo `T` corresponde. Como definições de valores, podemos sobrescrever definições de tipos em subclasses. Isso nos permite revelar mais informações sobre um tipo abstrato ao limitar o tipo associado (o qual descreve as possíveis instâncias concretas do tipo abstrato).
26+
27+
No seguinte programa temos uma classe `SeqBuffer` que nos permite armazenar apenas as sequências no buffer ao definir que o tipo `T` precisa ser um subtipo de `Seq[U]` para um novo tipo abstrato `U`:
28+
29+
```tut
30+
abstract class SeqBuffer extends Buffer {
31+
type U
32+
type T <: Seq[U]
33+
def length = element.length
34+
}
35+
```
36+
37+
[Traits](traits.html) ou [classes](classes.html) com membros de tipo abstratos são frequentemente utilizadas em combinação com instâncias de classe anônimas. Para ilustrar isso, agora analisamos um programa que lida com um buffer de sequência que se refere a uma lista de inteiros:
38+
39+
```tut
40+
abstract class IntSeqBuffer extends SeqBuffer {
41+
type U = Int
42+
}
43+
44+
object AbstractTypeTest1 extends App {
45+
def newIntSeqBuf(elem1: Int, elem2: Int): IntSeqBuffer =
46+
new IntSeqBuffer {
47+
type T = List[U]
48+
val element = List(elem1, elem2)
49+
}
50+
val buf = newIntSeqBuf(7, 8)
51+
println("length = " + buf.length)
52+
println("content = " + buf.element)
53+
}
54+
```
55+
56+
O tipo de retorno do método `newIntSeqBuf` refere-se a uma especialização da trait `Buffer` no qual o tipo `U` é agora equivalente a `Int`. Declaramos um tipo *alias* semelhante ao que temos na instanciação da classe anônima dentro do corpo do método `newIntSeqBuf`. Criamos uma nova instância de `IntSeqBuffer` na qual o tipo `T` refere-se a `List[Int]`.
57+
58+
Observe que muitas vezes é possível transformar os membros de tipo abstrato em parâmetros de tipo de classes e vice-versa. Aqui está uma versão do código acima que usa apenas parâmetros de tipo:
59+
60+
```tut
61+
abstract class Buffer[+T] {
62+
val element: T
63+
}
64+
abstract class SeqBuffer[U, +T <: Seq[U]] extends Buffer[T] {
65+
def length = element.length
66+
}
67+
object AbstractTypeTest2 extends App {
68+
def newIntSeqBuf(e1: Int, e2: Int): SeqBuffer[Int, Seq[Int]] =
69+
new SeqBuffer[Int, List[Int]] {
70+
val element = List(e1, e2)
71+
}
72+
val buf = newIntSeqBuf(7, 8)
73+
println("length = " + buf.length)
74+
println("content = " + buf.element)
75+
}
76+
```
77+
78+
Note que temos que usar [anotação de variância](variances.html) aqui; Caso contrário, não seríamos capazes de ocultar o tipo implementado pela sequência concreta do objeto retornado pelo método `newIntSeqBuf`. Além disso, há casos em que não é possível substituir tipos abstratos com parâmetros de tipo.
79+

pt-br/tutorials/tour/annotations.md

Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
---
2+
layout: tutorial
3+
title: Anotações
4+
5+
disqus: true
6+
7+
tutorial: scala-tour
8+
num: 31
9+
tutorial-next: default-parameter-values
10+
tutorial-previous: automatic-closures
11+
language: pt-br
12+
---
13+
14+
Anotações associam meta-informação com definições.
15+
16+
Uma cláusula de anotação simples tem a forma `@C` ou `@C(a1,..., an)`. Aqui, `C` é um construtor de uma classe `C`, que deve estar em conformidade com a classe `scala.Annotation`. Todos os argumentos de construtor fornecidos `a1, .., an` devem ser expressões constantes (isto é, expressões em literais numéricos, strings, literais de classes, enumerações Java e matrizes uni-dimensionais).
17+
18+
Uma cláusula de anotação se aplica à primeira definição ou declaração que a segue. Mais de uma cláusula de anotação pode preceder uma definição e uma declaração. Não importa a ordem em que essas cláusulas são declaradas.
19+
20+
O significado das cláusulas de anotação é _dependente da implementação_. Na plataforma Java, as seguintes anotações Scala têm um significado padrão.
21+
22+
| Scala | Java |
23+
| ------ | ------ |
24+
| [`scala.SerialVersionUID`](http://www.scala-lang.org/api/2.9.1/scala/SerialVersionUID.html) | [`serialVersionUID`](http://java.sun.com/j2se/1.5.0/docs/api/java/io/Serializable.html#navbar_bottom) (field) |
25+
| [`scala.cloneable`](http://www.scala-lang.org/api/2.9.1/scala/cloneable.html) | [`java.lang.Cloneable`](http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Cloneable.html) |
26+
| [`scala.deprecated`](http://www.scala-lang.org/api/2.9.1/scala/deprecated.html) | [`java.lang.Deprecated`](http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Deprecated.html) |
27+
| [`scala.inline`](http://www.scala-lang.org/api/2.9.1/scala/inline.html) (desde 2.6.0) | não há equivalente |
28+
| [`scala.native`](http://www.scala-lang.org/api/2.9.1/scala/native.html) (desde 2.6.0) | [`native`](http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html) (keyword) |
29+
| [`scala.remote`](http://www.scala-lang.org/api/2.9.1/scala/remote.html) | [`java.rmi.Remote`](http://java.sun.com/j2se/1.5.0/docs/api/java/rmi/Remote.html) |
30+
| [`scala.serializable`](http://www.scala-lang.org/api/2.9.1/index.html#scala.annotation.serializable) | [`java.io.Serializable`](http://java.sun.com/j2se/1.5.0/docs/api/java/io/Serializable.html) |
31+
| [`scala.throws`](http://www.scala-lang.org/api/2.9.1/scala/throws.html) | [`throws`](http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html) (keyword) |
32+
| [`scala.transient`](http://www.scala-lang.org/api/2.9.1/scala/transient.html) | [`transient`](http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html) (keyword) |
33+
| [`scala.unchecked`](http://www.scala-lang.org/api/2.9.1/scala/unchecked.html) (since 2.4.0) | não há equivalente |
34+
| [`scala.volatile`](http://www.scala-lang.org/api/2.9.1/scala/volatile.html) | [`volatile`](http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html) (keyword) |
35+
| [`scala.reflect.BeanProperty`](http://www.scala-lang.org/api/2.9.1/scala/reflect/BeanProperty.html) | [`Design pattern`](http://docs.oracle.com/javase/tutorial/javabeans/writing/properties.html) |
36+
37+
No exemplo a seguir, adicionamos a anotação `throws` à definição do método `read` para capturar a exceção lançada no código Java.
38+
39+
> Um compilador Java verifica se um programa contém manipuladores para [exceções verificadas](http://docs.oracle.com/javase/specs/jls/se5.0/html/exceptions.html) analisando quais exceções verificadas podem resultar da execução de um método ou construtor. Para cada exceção verificada que é um resultado possível, a cláusula **throws** para o método ou construtor _deve_ mencionar a classe dessa exceção ou uma das superclasses da classe dessa exceção.
40+
> Como Scala não tem exceções verificadas, os métodos Scala _devem_ ser anotados com uma ou mais anotações `throws`, de forma que o código Java possa capturar exceções lançadas por um método Scala.
41+
42+
43+
Exemplo de classe Scala que lança uma exceção do tipo `IOException`:
44+
45+
```
46+
package examples
47+
import java.io._
48+
class Reader(fname: String) {
49+
private val in = new BufferedReader(new FileReader(fname))
50+
@throws(classOf[IOException])
51+
def read() = in.read()
52+
}
53+
```
54+
55+
O programa Java a seguir imprime o conteúdo do arquivo cujo nome é passado como o primeiro argumento para o método `main`.
56+
57+
```
58+
package test;
59+
import examples.Reader; // Classe Scala acima declarada!!
60+
public class AnnotaTest {
61+
public static void main(String[] args) {
62+
try {
63+
Reader in = new Reader(args[0]);
64+
int c;
65+
while ((c = in.read()) != -1) {
66+
System.out.print((char) c);
67+
}
68+
} catch (java.io.IOException e) {
69+
System.out.println(e.getMessage());
70+
}
71+
}
72+
}
73+
```
74+
75+
Comentando-se a anotação `throws` na classe `Reader` o compilador produz a seguinte mensagem de erro ao compilar o programa principal Java:
76+
77+
```
78+
Main.java:11: exception java.io.IOException is never thrown in body of
79+
corresponding try statement
80+
} catch (java.io.IOException e) {
81+
^
82+
1 error
83+
```
84+
85+
### Anotações Java ###
86+
87+
**Nota:** Certifique-se de usar a opção `-target: jvm-1.5` com anotações Java.
88+
89+
Java 1.5 introduziu metadados definidos pelo usuário na forma de [anotações](http://java.sun.com/j2se/1.5.0/docs/guide/language/annotations.html). Uma característica chave das anotações é que elas dependem da especificação de pares no formato nome-valor para inicializar seus elementos. Por exemplo, se precisamos de uma anotação para rastrear a origem de alguma classe, podemos defini-la como:
90+
91+
```
92+
@interface Source {
93+
public String URL();
94+
public String mail();
95+
}
96+
```
97+
98+
O uso da anotação Source fica da seguinte forma
99+
100+
```
101+
@Source(URL = "http://coders.com/",
102+
mail = "support@coders.com")
103+
public class MyClass extends HisClass ...
104+
```
105+
106+
A uso de anotações em Scala parece uma invocação de construtor, para instanciar uma anotação Java é preciso usar argumentos nomeados:
107+
108+
```
109+
@Source(URL = "http://coders.com/",
110+
mail = "support@coders.com")
111+
class MyScalaClass ...
112+
```
113+
114+
Esta sintaxe é bastante tediosa, se a anotação contiver apenas um parâmetro (sem valor padrão), por convenção, se o nome for especificado como `value`, ele pode ser aplicado em Java usando uma sintaxe semelhante a Scala, ou seja parecido com a invocação de um construtor:
115+
116+
```
117+
@interface SourceURL {
118+
public String value();
119+
public String mail() default "";
120+
}
121+
```
122+
123+
O uso da anotação SourceURL fica da seguinte forma
124+
125+
```
126+
@SourceURL("http://coders.com/")
127+
public class MyClass extends HisClass ...
128+
```
129+
130+
Neste caso, a Scala oferece a mesma possibilidade
131+
132+
```
133+
@SourceURL("http://coders.com/")
134+
class MyScalaClass ...
135+
```
136+
137+
O elemento `mail` foi especificado com um valor padrão, portanto não precisamos fornecer explicitamente um valor para ele. No entanto, se precisarmos fazer isso, não podemos misturar e combinar os dois estilos em Java:
138+
139+
```
140+
@SourceURL(value = "http://coders.com/",
141+
mail = "support@coders.com")
142+
public class MyClass extends HisClass ...
143+
```
144+
145+
Scala proporciona mais flexibilidade a respeito disso:
146+
147+
```
148+
@SourceURL("http://coders.com/",
149+
mail = "support@coders.com")
150+
class MyScalaClass ...
151+
```
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
---
2+
layout: tutorial
3+
title: Sintaxe de Função Anônima
4+
5+
disqus: true
6+
7+
tutorial: scala-tour
8+
num: 6
9+
tutorial-next: higher-order-functions
10+
tutorial-previous: mixin-class-composition
11+
language: pt-br
12+
---
13+
14+
Scala fornece uma sintaxe relativamente leve para definir funções anônimas. A expressão a seguir cria uma função sucessor para inteiros:
15+
16+
```tut
17+
(x: Int) => x + 1
18+
```
19+
20+
Isso é uma abreviação para a definição de classe anônima a seguir:
21+
22+
```tut
23+
new Function1[Int, Int] {
24+
def apply(x: Int): Int = x + 1
25+
}
26+
```
27+
28+
Também é possível definir funções com múltiplos parâmetros:
29+
30+
```tut
31+
(x: Int, y: Int) => "(" + x + ", " + y + ")"
32+
```
33+
34+
ou sem parâmetros:
35+
36+
```tut
37+
() => { System.getProperty("user.dir") }
38+
```
39+
40+
Há também uma forma muito simples de escrever tipos de funções. Aqui estão os tipos da três funções acima definidas:
41+
42+
```
43+
Int => Int
44+
(Int, Int) => String
45+
() => String
46+
```
47+
48+
Essa sintaxe é uma abreviação para os seguintes tipos:
49+
50+
```
51+
Function1[Int, Int]
52+
Function2[Int, Int, String]
53+
Function0[String]
54+
```
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
---
2+
layout: tutorial
3+
title: Construção Automática de Closures de Tipo-Dependente
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+
_Nota de tradução: A palavra `closure` em pode ser traduzida como encerramento/fechamento, porém é preferível utilizar a notação original_
15+
16+
Scala permite 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*).
17+
18+
O código a seguir demonstra esse mecanismo:
19+
20+
```tut
21+
object TargetTest1 extends App {
22+
def whileLoop(cond: => Boolean)(body: => Unit): Unit =
23+
if (cond) {
24+
body
25+
whileLoop(cond)(body)
26+
}
27+
var i = 10
28+
whileLoop (i > 0) {
29+
println(i)
30+
i -= 1
31+
}
32+
}
33+
```
34+
35+
A função `whileLoop` recebe 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.
36+
37+
Podemos combinar o uso de [operadores infix/postfix](operators.html) com este mecanismo para criar declarações mais complexas (com uma sintaxe agradável).
38+
39+
Aqui está a implementação de uma instrução que executa loop a menos que uma condição seja satisfeita:
40+
41+
```tut
42+
object TargetTest2 extends App {
43+
def loop(body: => Unit): LoopUnlessCond =
44+
new LoopUnlessCond(body)
45+
protected class LoopUnlessCond(body: => Unit) {
46+
def unless(cond: => Boolean) {
47+
body
48+
if (!cond) unless(cond)
49+
}
50+
}
51+
var i = 10
52+
loop {
53+
println("i = " + i)
54+
i -= 1
55+
} unless (i == 0)
56+
}
57+
```
58+
59+
A função `loop` aceita apenas um corpo 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> )`.
60+
61+
Aqui está a saída de quando o `TargetTest2` é executado:
62+
63+
```
64+
i = 10
65+
i = 9
66+
i = 8
67+
i = 7
68+
i = 6
69+
i = 5
70+
i = 4
71+
i = 3
72+
i = 2
73+
i = 1
74+
```

0 commit comments

Comments
 (0)