English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Extractor do Scala

O extrator extrai os parâmetros usados para construir o objeto passado para ele.

A biblioteca padrão Scala contém alguns extratores pré-definidos, vamos conhecê-los brevemente.

O extrator Scala é um objeto com o método unapply. O método unapply é a operação inversa do método apply: o unapply aceita um objeto, então extrai valores do objeto, e esses valores geralmente são usados para construir o valor do objeto.

Os seguintes exemplos demonstram o objeto extrator de endereços de e-mail:

object Test {
   def main(args: Array[String]) {
      
      println("Método Apply: " + apply("Zara", "gmail.com"));
      println("Método Unapply: " + unapply("[email protected]"));
      println("Método Unapply: " + unapply("Zara Ali"));
   }
   // Método de injeção (opcional)
   def apply(user: String, domain: String) = {
      usuário +"@"+ domínio
   }
   // Método de extração (obrigatório)
   def unapply(str: String): Option[(String, String)] = {
      val parts = str.split("@"}
      if (parts.length == 2{
         Some(parts(0), parts(1)) 
      }else{
         None
      }
   }
}

Execute o código acima e o resultado será:

$ scalac Test.scala 
$ scala Test
Método Apply: [email protected]
Método Unapply: Some((Zara,gmail.com))
Método Unapply: None

Os objetos acima definem dois métodos: apply e unapply método. Através do método apply, não é necessário usar a operação new para criar objetos. Portanto, você pode usar a expressão Test("Zara", "gmail.com") para construir a string "[email protected]".

O método unapply é a operação inversa do método apply: o unapply aceita um objeto, então extrai valores do objeto, e esses valores geralmente são usados para construir o valor do objeto. No exemplo, usamos O método unapply extrai o nome de usuário e o sufixo do endereço de e-mail do objeto.

O método unapply retorna None quando a string passada não é um endereço de e-mail. O exemplo de código é o seguinte:

unapply("[email protected]") é equivalente a Some("Zara", "gmail.com")
unapply("Zara Ali") é equivalente a None

Uso de Match no Extractor

Quando instanciamos uma classe, podemos passar 0 ou mais parâmetros, o compilador chama o método apply durante a instância. Podemos definir o método apply em classes e objetos.

Como mencionamos anteriormente, o unapply é usado para extrair o valor que especificamos, o que é o oposto da operação do apply. Quando usamos a sentença match em um objeto extractor, o unapply é executado automaticamente, conforme mostrado a seguir:

object Test {
   def main(args: Array[String]) {
      
      val x = Test(5)
      println(x)
      x match
      {
         case Test(num) => println(x + " é " + num + " dobro!")
         //unapply foi chamado
         case _ => println("Não pode ser calculado")
      }
   }
   def apply(x: Int) = x*2
   def unapply(z: Int): Option[Int] = if (z%2==0) Some(z/2) else None
}

Execute o código acima e o resultado será:

$ scalac Test.scala 
$ scala Test
10
10 é 5 dobro!