Correspondência de tipos e valores
Padrões de tipos.
Correspondência de tipos e valores é uma aula grátis de Scala for Backend Engineering & Functional Programming no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Scala for Backend Engineering & Functional Programming, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Scala for Backend Engineering & Functional Programming inclui 4 aulas no total.
Padrões de tipo
Além de corresponder a valores literais, match pode ramificar com base no tipo de um valor. Isso é chamado de padrão de tipo.
Você escreve case x: Type => e a ramificação é executada quando o valor é desse tipo, associando-o a x.
Correspondência por tipo
Quando um valor tem um tipo geral como Any, você pode descobrir seu tipo concreto com um padrão de tipo.
Cada case x: T verifica o tipo em tempo de execução.
object Main {
def describe(x: Any): String = x match {
case i: Int => "an Int"
case s: String => "a String"
case _ => "something else"
}
def main(args: Array[String]): Unit = {
println(describe(5))
println(describe("hi"))
println(describe(3.14))
}
}Usando o valor associado
O nome associado tem o tipo correspondente, portanto você pode chamar seus métodos com segurança nessa ramificação.
Não é necessário fazer conversão: o compilador conhece o tipo dentro do caso.
object Main {
def shout(x: Any): String = x match {
case s: String => s.toUpperCase
case i: Int => (i * 2).toString
case _ => "?"
}
def main(args: Array[String]): Unit = {
println(shout("hello"))
println(shout(21))
}
}Tipo e valor juntos
Você pode combinar padrões de valor e padrões de tipo no mesmo match. Os padrões de valor geralmente são mais específicos, portanto coloque-os primeiro.
object Main {
def check(x: Any): String = x match {
case 0 => "zero int"
case i: Int => s"nonzero int $i"
case _ => "not an int"
}
def main(args: Array[String]): Unit = {
println(check(0))
println(check(7))
println(check("x"))
}
}Correspondência de Double e Boolean
Os padrões de tipo funcionam para qualquer tipo, incluindo Double, Boolean e Char.
object Main {
def kind(x: Any): String = x match {
case d: Double => s"double $d"
case b: Boolean => s"bool $b"
case _ => "other"
}
def main(args: Array[String]): Unit = {
println(kind(2.5))
println(kind(true))
}
}Correspondência de coleções por tipo
Você também pode fazer correspondência com tipos de contêiner, como List. Aqui distinguimos uma lista de outros valores.
object Main {
def info(x: Any): String = x match {
case l: List[_] => s"a list of size ${l.size}"
case _ => "not a list"
}
def main(args: Array[String]): Unit = {
println(info(List(1, 2, 3)))
println(info("nope"))
}
}Um uso comum: tratando Any
Os padrões de tipo são especialmente úteis quando uma função recebe Any e precisa reagir de forma diferente a cada tipo, por exemplo, para registrar informações ou serializar dados.
object Main {
def render(x: Any): String = x match {
case i: Int => s"int=$i"
case d: Double => s"dbl=$d"
case s: String => s"str=$s"
case _ => "unknown"
}
def main(args: Array[String]): Unit = {
List(1, 2.0, "three").foreach(v => println(render(v)))
}
}A ordem continua importante
Como em toda correspondência, os padrões de tipo são verificados de cima para baixo. Um tipo mais abrangente colocado primeiro pode ocultar um tipo mais específico abaixo dele.
Sempre ordene do mais específico para o mais geral.
object Main {
def label(x: Any): String = x match {
case s: String => "string first"
case _: Any => "anything"
}
def main(args: Array[String]): Unit = {
println(label("hi"))
println(label(99))
}
}Ressalva sobre o apagamento de tipos
Em tempo de execução, os parâmetros de tipo genéricos são apagados. Assim, List[Int] e List[String] parecem iguais. Fazer correspondência com List[Int] verifica apenas se o valor é uma List.
Use List[_] para deixar isso explícito e evitar avisos.
Por que usar padrões de tipo?
Os padrões de tipo permitem que você:
- Restrinja com segurança um tipo geral sem fazer conversões
- Trate valores heterogêneos com clareza
- Combine padrões de valor e guardas
Eles são um passo rumo à correspondência com classes de caso e ADTs.
Reunindo tudo
Combine padrões de valor e de tipo para classificar uma entrada mista.
object Main {
def classify(x: Any): String = x match {
case 0 => "zero"
case i: Int => "int"
case s: String => "text of length " + s.length
case _ => "other"
}
def main(args: Array[String]): Unit = {
println(classify(0))
println(classify(5))
println(classify("hey"))
}
}Verificação rápida
Teste seu conhecimento sobre padrões de tipo.
Recapitulação
Você aprendeu a fazer correspondência por tipos:
case x: Typefaz a correspondência pelo tipo em tempo de execução e associa o valor ax- O valor associado tem o tipo correspondente, portanto não é necessária nenhuma conversão
- Combine padrões de valor e de tipo, começando pelos mais específicos
- Os parâmetros genéricos são apagados, portanto use
List[_]
Perguntas Frequentes
A aula “Correspondência de tipos e valores” é grátis?
Sim — o texto completo de “Correspondência de tipos e valores” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Scala for Backend Engineering & Functional Programming, atualize para CoddyKit PRO. O curso de Scala for Backend Engineering & Functional Programming inclui 4 aulas no total.
O que vou aprender em “Correspondência de tipos e valores”?
Padrões de tipos. Você pratica Scala for Backend Engineering & Functional Programming com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Scala for Backend Engineering & Functional Programming?
Nenhuma experiência prévia é necessária. Scala for Backend Engineering & Functional Programming no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.
Quanto tempo leva a aula “Correspondência de tipos e valores”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Scala for Backend Engineering & Functional Programming?
Sim. Cada aula de Scala for Backend Engineering & Functional Programming inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Expressões match
- Correspondência de tipos e valores
- Guardas e vinculação
- Desconstrução