Curso
Confira o curso recém-lançado da DataCamp sobre Scala: Introduction to Scala.
Scala é amplamente usado por cientistas de dados para lidar com grandes volumes de dados em conjunto com o Apache Spark no universo de Big Data. É uma linguagem de programação orientada a objetos e funcional, com vários recursos essenciais, como:
- Scala é uma linguagem de tipagem estática: o tipo de dado da variável é definido antes do uso. A checagem de tipos acontece em tempo de compilação, não em tempo de execução.
- Também é "fortemente tipada": as variáveis são verificadas antes de você realizar operações com elas.
- Suporta inferência de tipos: o compilador infere o tipo a partir da expressão ou dos literais, então declarar o tipo da variável é opcional.
Neste tutorial, você vai ver os seguintes tópicos:
- Variáveis
- Regras para definir variáveis em Scala
- Variáveis mutáveis
- Variáveis imutáveis
- Declarações e atribuições múltiplas
- Escopo de variáveis em Scala
Variáveis
Variáveis são espaços nomeados na memória; o compilador reserva o local conforme o tipo de dado da variável correspondente. Em Scala, a declaração segue a sintaxe:
val or val variable_name: variable_datatype = value;
Na sintaxe acima, a variável pode ser definida de duas formas, usando as palavras-chave 'var' ou 'val'. Ela inclui 'variable_name' como o nome da sua nova variável, seguido de dois-pontos. O tipo da variável é 'variable_datatype', que pode ser qualquer tipo válido. Em seguida, o 'value' é atribuído a 'variable_name'.
Por exemplo:
val varValue: Byte = 8;
'val' é a palavra-chave para definir a variável, e 'varValue' é o nome. O tipo é 'Byte' e o valor é 8. 'Byte' é um valor assinado de 8 bits, que varia de 2−7 a 27−1.
O 'variable_datatype' pode ser qualquer tipo existente em Scala, como:
- Int: inteiro assinado de 32 bits (positivo ou negativo), com intervalo de 2−31 a 231−1.
- Byte: valor assinado de 8 bits, com intervalo de 2−7 a 27−1.
- Short: valor assinado de 16 bits, com intervalo de 2−15 a 215−1.
- Float: pode ser 32 bits ou 64 bits.
Da mesma forma, outros tipos como Long, Char, Boolean, String, Null têm seus próprios intervalos e particularidades. Uma explicação detalhada está no tutorial Beginner’s Guide to Scala. Além disso, 'variable_datatype' começa com letra maiúscula (por exemplo, Int com 'I'), indicando que todos esses tipos são objetos em Scala.
Regras para definir variáveis em Scala
As regras e convenções para definir variáveis em Scala são:
- Use lower camel case para nomes de variáveis. Por exemplo, em 'nameOfGirl', o 'n' inicial é minúsculo; depois, capitalize a primeira letra de cada palavra, como 'O' e 'G'.
- Não use palavras reservadas ou keywords de Scala como nome de variável.
- O nome da variável pode conter cifrão ('$') e sublinhado ('_'). Outros caracteres especiais como '#', '&' etc. não são permitidos. O uso de sublinhado é desencorajado.
- Não use espaço em branco (tabs, espaços) no nome da variável.
- O nome da variável deve começar com uma letra; não pode começar com número ou outros caracteres.
Variáveis mutáveis
Variáveis mutáveis permitem alterar seus valores mesmo depois da declaração.
A sintaxe de uma variável mutável é:
var variable_name : variable_datatype = value;
Ela também pode ser definida assim:
var variable_name = value;
Exemplo de variável mutável:
var nameOfThing: String = "Car";
No exemplo acima, var é a keyword para variáveis mutáveis. O nome é 'nameOfThing'. Em seguida vem os dois-pontos e o tipo 'String'. O valor armazenado na memória será 'Car'.
O mesmo exemplo, com sintaxe alternativa:
var nameOfThing = "Car";
Você pode definir a variável sem explicitar o tipo, como acima. O compilador de Scala determina automaticamente que é do tipo 'String' — esse recurso é chamado de inferência de tipos.
Você pode alterar o valor facilmente, assim:
nameOfThing = "Bike";
print(nameOfThing)
O valor mudará de "Car" para "Bike". A saída será "Bike", porque a palavra-chave 'var' permite reatribuir o valor da variável (Fonte: Variables in Scala).
Variáveis imutáveis
Variáveis imutáveis são aquelas cujo valor não pode ser alterado após a criação e são declaradas com a palavra-chave 'val'.
A sintaxe de uma variável imutável é:
val variable_name : variable_data type = value;
Ela também pode ser definida assim:
val variable_name = value;
Exemplo de variável imutável:
val numberOfThing: Int = 2;
No exemplo acima, val define uma variável imutável chamada 'numberOfThing'. Depois do dois-pontos, o tipo é 'Int', e o valor armazenado é 2.
O mesmo exemplo, com sintaxe alternativa:
val numberOfThing = 2;
Você pode definir a variável sem explicitar o tipo; o compilador de Scala infere que é um 'Int'. Esse processo é a inferência de tipos (Fonte: Variables in Scala).
Você não pode alterar o valor da variável, como abaixo:
numberOfThing = 7;
O exemplo acima resultará em um erro como "error: not found: value numberOfThing", mostrando que a reatribuição não é possível, conforme abaixo:

Declarações e atribuições múltiplas
Declarações múltiplas são possíveis em Scala usando a palavra-chave 'var', com os nomes de variáveis separados por vírgulas, e o sinal "=" com os respectivos valores.
var (x, y, z) = (5, 4.5, "Sit")
No exemplo acima, as variáveis x, y e z recebem os valores 5, 4.5 e "Sit", respectivamente.

Também é possível fazer atribuições múltiplas em uma linha usando 'val', com os nomes separados por vírgulas e o "=" com o valor.
val a, b, c = 1;
No exemplo acima, as variáveis a, b e c recebem todas o valor 1.

Escopo de uma variável
Escopo é a visibilidade das variáveis, que têm seu tempo de vida dentro dos blocos de código onde são declaradas. A variável pode estar em escopo local ou global. Exemplo:
var globalVar = 10
def sub(){
var difference = 9-4;
}
print(difference)//Error
print(globalVar)//Valid
No código acima, 'difference' está no escopo local, pois é declarada dentro do método 'sub'; a operação de subtração funciona, mas imprimir seu valor fora do método gera erro. Já a variável global 'globalVar' pode ser acessada em qualquer parte do programa.
Há três tipos de escopo para variáveis em Scala (Fonte: Scala- Variables):
- Variáveis locais
- Fields
- Parâmetros de método
Variáveis locais
Variáveis locais (mutáveis ou imutáveis) são declaradas dentro de um método e só são acessíveis dentro dele.
Veja um exemplo simples de variáveis locais:
class Perimeter
{
def triangle()
{
var side1 = 10;
var side2 = 20;
var side3 = 30;
var total = side1+side2+side3;
print("Perimeter of the triangle is: " + total);
}
}
object Test
{
def main(args:Array[String])
{
val p1 = new Perimeter()
p1.triangle()
}
}
defined class Perimeter
defined object Test
O código acima gera:
The perimeter of the triangle is: 60
O programa tem uma classe 'Perimeter' e um objeto 'Test'. O método triangle possui três variáveis mutáveis: side1, side2 e side3. O cálculo e a impressão do resultado são feitos dentro do método, gerando a saída correta.
Fields
Variáveis definidas dentro da classe são chamadas de fields e podem ser mutáveis ou imutáveis. Se a variável é declarada diretamente na classe (e não dentro de um método), o modificador de acesso padrão é público, e ela pode ser acessada em qualquer lugar do programa. Já uma variável privada pode ser acessada dentro da própria classe, mas não fora do escopo da classe (nem pelo objeto).
class FieldExample
{
var value1 = 10;
private var value2 = 30;
def operation()
{
println("Value of value1:"+value1)
}
println("Value of value2: "+value2);
}
object Demo
{
def Main(args:Array[String])
{
val obj = new FieldExample()
obj.operation()
print(obj.value1)//Valid
print(obj.value2)
}
}
defined class FieldExample
defined object Demo
O código acima gera:
Value of value2: 30
Value of value1:10
10
O programa tem a classe 'FieldExample', o objeto 'Demo' e o método 'operation'. A variável pública value1 pode ser acessada por notação de ponto e imprime 10. Já a variável privada value2 vale 30; tentar acessá-la e imprimi-la fora da classe causará erro.
Parâmetros de método
Parâmetros de método são variáveis que recebem valores quando o método é chamado; por padrão, eles são imutáveis (definidos com 'val'). Esses valores podem ser usados dentro do método e, quando há referência, podem influenciar o acesso fora do método.
Veja um exemplo simples de parâmetros de método:
class Triangle
{
def calculate(height: Int, width: Int)
{
var result = 0.5*(height+width);
println("Area of triangle is: " + result);
}
}
object Area
{
def main(args:Array[String])
{
val a = new Triangle()
a.calculate(4,5);
}
}
defined class Triangle
defined object Area
O código acima gera:
Area of triangle is: 4.5
O programa contém a classe 'Triangle' com o método 'calculate', que recebe dois parâmetros: height e width. Os valores inteiros 4 e 5 são passados quando 'calculate' é chamado a partir da instância 'a'.
Conclusão
Parabéns por chegar ao final deste tutorial!
Nele, você viu variáveis em Scala, regras para defini-las, diferentes tipos, como fazer declarações e atribuições múltiplas e como funciona o escopo.
Se quiser aprender mais sobre Scala, faça o curso Introduction to Scala da DataCamp.
