Scala Extractores (Extractor)
Un extractor extrae del objeto que se le pasa los parámetros que se usaron para construir ese objeto.
La biblioteca estándar de Scala incluye algunos extractores predefinidos y los repasaremos brevemente.
Un extractor de Scala es un objeto con un método unapply. El método unapply es la operación inversa del método apply: unapply recibe un objeto y luego extrae valores del objeto; los valores extraídos suelen ser los valores utilizados para construir ese objeto.
El siguiente ejemplo demuestra un objeto extractor para direcciones de correo electrónico:
Ejemplo
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 inyección (opcional)
def apply(user: String, domain: String) = {
user +"@"+ domain
}
// Método de extracción (obligatorio)
def unapply(str: String): Option[(String, String)] = {
val parts = str split "@"
if (parts.length == 2){
Some(parts(0), parts(1))
}else{
None
}
}
}
Al ejecutar el código anterior, el resultado es:
$ scalac Test.scala $ scala Test Apply 方法 : [email protected] Unapply 方法 : Some((Zara,gmail.com)) Unapply 方法 : None
El objeto anterior define dos métodos:applyyunapplyMétodo. Gracias al método apply, no necesitamos usar la operación new para crear objetos. Así que puedes construir una cadena "[email protected]" mediante la sentencia Test("Zara", "gmail.com").
El método unapply es la operación inversa del método apply: unapply recibe un objeto y luego extrae valores del objeto; los valores extraídos suelen ser los que se usan para construir el objeto. En el ejemplo, usamos el método Unapply para extraer del objeto el nombre de usuario y el sufijo de la dirección de correo electrónico.
En el ejemplo, el método unapply devuelve None cuando la cadena pasada no es una dirección de correo electrónico. El código se muestra a continuación:
unapply("[email protected]") 相等于 Some("Zara", "gmail.com")
unapply("Zara Ali") 相等于 None
Los extractores usan la coincidencia de patrones
Al instanciar una clase, podemos pasar cero o más parámetros; el compilador llamará al método apply al instanciar. Podemos definir el método apply tanto en la clase como en el objeto.
Como mencionamos antes, unapply se usa para extraer el valor que especificamos buscar; es la operación opuesta a apply. Cuando usamos una sentencia match en un objeto extractor, unapply se ejecutará automáticamente, como se muestra a continuación:
Ejemplo
def main(args: Array[String]) {
val x = Test(5)
println(x)
x match
{
case Test(num) => println(x + " es " + num + " el doble de!")
// unapply es llamado
case _ => println("No se puede calcular")
}
}
def apply(x: Int) = x*2
def unapply(z: Int): Option[Int] = if (z%2==0) Some(z/2) else None
}
Al ejecutar el código anterior, el resultado es:
$ scalac Test.scala $ scala Test 10 10 是 5 的两倍!Otras extensiones