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