Se você começou a estudar Scala há um tempo, certamente já encontrou em algum código o famigerado _ (chamado de sublinhado, placeholder, underscore, underbar…). Se ficou meio confuso, a confunsão é justificada pelo fato desse símbolo ter quatro usos (pelo menos que eu saiba) em Scala. Podemos encará-lo como uma espécie de caractere coringa, com comportamento distinto dependendo de uma das quatro situações.
O uso mais simples do _ é como coringa para importação de classes em diferentes pacotes. Funciona da mesma forma que o * (asterisco) em Java.
package br.com.verde
import java.util._
class Lab {
val today = new Date
}
Isso porque o asterisco tem outra finalidade na linguagem de programação criada por Martin Odersky. Para Scala o asterisco é o operador de referência, usado para declarar ponteiros. Calma, calma! É só brincadeira! Passou, passou! O asterisco em Scala é usado como “operador” (método/função) para multiplicações e para declarar varargs.
O _ também pode ser um coringa em um “casamento” de padrões (pattern matching). Representando um valor qualquer:
object Fatorial {
def f(n: Int): Int = n match {
case 0 = 1
case _ = n * f(n - 1)
}
}
No código acima quando o for igual a (“casar com”)
, a função retornará
. Para qualquer outro valor, retornará o resultado da expressão
.
O terceiro uso do _ já é um pouco mais capcioso. Podemos usá-lo para “iniciar” vars com um valor padrão.
class Lab {
var numero: Int = _ //zero
var booleano: Boolean = _ //falso
var caracter: Char = _ //vazio
var texto: String = _ //null
var dinheiro: BigDecimal = _ //null
}
Para cada “tipo” de variável o _ assumirá um valor. Apesar de tudo em Scala ser um objeto, Int, Boolean e Char não receberam null como valor.
Bem, como diria o suicida otimista ao passar caindo pelo quinto andar do prédio de onde pulou: “Até aqui tudo bem”. Na segunda parte veremos os usos mais complicados do _.
Édson Rocha Patrício
