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

提取器Extractor Scala

El extractor extrae los parámetros utilizados para construir el objeto desde el objeto pasado.

La biblioteca estándar de Scala contiene algunos extractores predefinidos, y haremos una revisión general de ellos.

El extractor de Scala es un objeto que tiene un método unapply. El método unapply es una operación inversa del método apply: unapply acepta un objeto, luego extrae valores del objeto, y estos valores generalmente se utilizan para construir el valor del objeto.

El siguiente ejemplo muestra el objeto extractor de direcciones de correo electrónico:

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 inyección (opcional)
   def apply(usuario: String, dominio: String) = {
      usuario +"@"+ dominio
   }
   // 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
      }
   }
}

执行以上代码,输出结果为:

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

Los objetos anteriores definen dos métodos: apply y unapply método. A través del método apply, no es necesario usar la operación new para crear objetos. Por lo tanto, puedes construir la cadena "[email protected]" con la语句 Test("Zara", "gmail.com").

El método unapply es una operación inversa del método apply: unapply acepta un objeto, luego extrae valores del objeto, y estos valores generalmente se utilizan para construir el valor del objeto. En el ejemplo, utilizamos El método unapply extrae el nombre de usuario y el sufijo de la dirección de correo electrónico del objeto.

El método unapply devuelve None cuando el cadena de entrada no es una dirección de correo electrónico. Aquí hay un ejemplo de código:

unapply("[email protected]") 相等于 Some("Zara", "gmail.com")
unapply("Zara Ali") 相等于 None

使用模式匹配提取器

在我们实例化一个类时,可以带上0个或者多个的参数,编译器在实例化时会调用 apply 方法。我们可以在类和对象中都定义 apply 方法。

就像我们之前提到过的,unapply 用于提取我们指定查找的值,它与 apply 的操作相反。 当我们在提取器对象中使用 match 语句时,unapply 将自动执行,如下所示:

object Test {
   def main(args: Array[String]) {
      
      val x = Test(5)
      println(x)
      x match
      {
         case Test(num) => println(x + " 是 " + num + " 的两倍!")
         //unapply 被调用
         case _ => println("无法计算")
      }
   }
   def apply(x: Int) = x*2
   def unapply(z: Int): Option[Int] = if (z%2==0) Some(z/2) else None
}

执行以上代码,输出结果为:

$ scalac Test.scala 
$ scala Test
10
10 是 5 的两倍!