Variáveis
Soyuz tem duas formas de declarar um binding:
| Keyword | Mutável | Redeclarável | Uso |
|---|---|---|---|
val | Não | Sim (tipo diferente) | Caso padrão |
var | Sim | Sim | Estado que muda |
val — imutável
Section titled “val — imutável”val declara um binding imutável. Após a atribuição inicial, o valor não pode ser alterado.
val nome = "Soyuz"val versao: Int = 1O tipo pode ser inferido (: é opcional quando o compilador consegue deduzir):
val x = 42 // Int inferidoval pi = 3.14 // Float inferidoval ok = true // Bool inferidoShadowing com val
Section titled “Shadowing com val”val pode ser redeclarado no mesmo escopo, desde que o tipo seja diferente. Isso é chamado de shadowing.
val x: Int = 10val x: String = "dez" // OK — tipo diferente, shadowing legítimoval x: Int = 10val x: Int = 20 // ERRO — mesmo tipo, use var se quer mutabilidadevar — mutável
Section titled “var — mutável”var declara um binding mutável. O valor pode ser reatribuído a qualquer momento.
var contador = 0contador = contador + 1 // OKcontador = 42 // OKO tipo é fixo após a declaração — você não pode reatribuir com um tipo diferente:
var x = 10x = "texto" // ERRO — x é Int, não StringQuando usar var
Section titled “Quando usar var”Use var apenas quando o estado precisa realmente mudar ao longo do tempo. Exemplos típicos:
// Acumulador em loopvar total = 0.0for preco in precos { total = total + preco}
// Campo de class que mudaclass Contador { var count: Int = 0
fn incrementar(self) { self.count = self.count + 1 }}Inferência de tipos
Section titled “Inferência de tipos”Em ambos os casos, o compilador infere o tipo quando há uma expressão inicial clara:
val a = 10 // Intval b = 3.14 // Floatval c = true // Boolval d = "texto" // Stringval e = (1, "oi") // (Int, String)val f = [1, 2, 3] // List[Int]Você pode sempre anotar o tipo explicitamente para clareza ou para resolver ambiguidades:
val x: Float = 10 // sem a anotação, seria Intval lista: List[Int] = []Escopo
Section titled “Escopo”Variáveis existem no bloco em que foram declaradas. Blocos são delimitados por {}:
fn exemplo() { val x = 10
if true { val y = 20 // y só existe aqui val x = "sombra" // shadowing — tipo diferente é OK }
// y não existe aqui // x aqui ainda é o Int 10}Resumo
Section titled “Resumo”// Imutável, tipo inferidoval nome = "Soyuz"
// Imutável, tipo explícitoval versao: Int = 1
// Shadowing legítimo — tipo diferenteval id: Int = 42val id: String = "USR-42"
// Mutávelvar contador = 0contador = contador + 1