Scala提取器
Scala中的提取器是一个拥有称为unapply
方法,并使用unapply
方法作为其成员之一的对象。 该unapply
方法的目的是匹配一个值并将其分开。 通常,提取器对象还定义了一种用于构建值的双重方法,但这不是必需的。
示例
下面举个例子来定义apply
和unapply
方法。apply
方法与Test
转换为可应用于括号中的参数的对象,与apply
方法相同。所以可以写Test(“Maxsu”,“gmail.com”)
来构造字符串“Maxsu@gmail.com”
。
unapply
方法是将Test
类转换为提取器,并反转了应用的构建过程。在应用两个字符串,并形成一个电子邮件地址字符串,取消应用接收电子邮件地址并返回潜在的两个字符串:地址的用户和域。
语法
unapply("Maxsu@gmail.com") equals Some("Maxsu", "gmail.com") unapply("Maxsu Ali") equals None
以下示例程序显示电子邮件地址的提取对象。
object Demo { def main(args: Array[String]) { println ("Apply method : " + apply("Maxsu", "gmail.com")); println ("Unapply method : " + unapply("Maxsu@gmail.com")); println ("Unapply method : " + unapply("Maxsu 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 } } }
将上述程序保存在源文件:Demo.scala中,使用以下命令编译和执行此程序。
D:\>scalac Demo.scala D:\>scala Demo Apply method : Maxsu@gmail.com Unapply method : Some((Maxsu,gmail.com)) Unapply method : None
抽取器模式匹配
当一个类的实例后跟括号为零个或多个参数的列表时,编译器会调用该实例上的apply
方法。 可以在对象和类中定义apply
方法。
如上所述,unapply
方法的目的是提取正在寻找的特定值。当使用match
语句比较提取器对象时,将自动执行unapply
方法。
尝试以下示例程序 -
object Demo { def main(args: Array[String]) { val x = Demo(5) println(x) x match { case Demo(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 }
将上述程序保存在源文件:Demo.scala中,使用以下命令编译和执行此程序。
D:\>scalac Demo.scala D:\>scala Demo is bigger two times than 5
上一篇:Scala异常处理
下一篇:Scala文件I/O