位置:首页 > > Scala提取器

Scala提取器

提取器在Scala中是一个对象,有一个叫非应用作为其成员的一种方法。即不应用方法的目的是要匹配的值,并把它拆开。通常,提取对象还限定了双方法申请构建值,但是这不是必需的。

下面的例子显示电子邮件地址的提取器对象:

object Test {
   def main(args: Array[String]) {
      
      println ("Apply method : " + apply("Zara", "gmail.com"));
      println ("Unapply method : " + unapply("Zara@gmail.com"));
      println ("Unapply method : " + unapply("Zara Ali"));

   }
   // The injection method (optional)
   def apply(user: String, domain: String) = {
      user +"@"+ domain
   }

   // The extraction method (mandatory)
   def unapply(str: String): Option[(String, String)] = {
      val parts = str split "@"
      if (parts.length == 2){
         Some(parts(0), parts(1)) 
      }else{
         None
      }
   }
}

这个对象定义了 apply 和unapply 方法。该apply 方法具有相同的含义:它原来的测试为可以被应用到的参数在括号中的方法所应用的相同的方式的对象。所以,可以写为Test("Zara", "gmail.com") 来构造字符串“Zara@gmail.com”。

unapply方法使测试类成为一个提取器并反转应用的构造过程。应用需要两个字符串,并形成了一个电子邮件地址以找到它们,非应用unapply需要一个电子邮件地址,并可能返回两个字符串:用户和地址的域名。

unapply还必须处理中给定的字符串不是一个电子邮件地址的情况。这就是为什么unapply返回一个选项型过对字符串。其结果要么是一些(用户域)如果字符串str使用给定电子邮件地址的用户和域的部分,或None,如果str不是一个电子邮件地址。下面是一些例子:

unapply("Zara@gmail.com") equals Some("Zara", "gmail.com")
unapply("Zara Ali") equals None

让我们编译和运行上面的程序,这将产生以下结果:

C:/>scalac Test.scala
C:/>scala Test
Apply method : Zara@gmail.com
Unapply method : Some((Zara,gmail.com))
Unapply method : None

C:/>

模式匹配使用提取器:

当一个类的实例后跟括号使用零个或多个参数的列表,所述编译器调用应用的方法在该实例上。我们可以定义同时适用对象和类。

如上述所提到的,unapply方法的目的是提取我们寻找一个特定的值。它相反的操作和apply一样。当比较使用匹配语句中unapply方法的提取对象将被自动执行,如下所示:

object Test {
   def main(args: Array[String]) {
      
      val x = Test(5)
      println(x)

      x match
      {
         case Test(num) => println(x+" is bigger two times than "+num)
         //unapply is invoked
         case _ => println("i cannot calculate")
      }

   }
   def apply(x: Int) = x*2
   def unapply(z: Int): Option[Int] = if (z%2==0) Some(z/2) else None
}

让我们编译和运行上面的程序,这将产生以下结果:

C:/>scalac Test.scala
C:/>scala Test
10
10 is bigger two times than 5

C:/>