Scala中的提取器Extractors是一个对象 ,该对象具有称为 unapply 的方法,该方法的目的是匹配值并将其拆开。
让我们以对象定义 apply 和 unapply 方法为示例, apply方法的含义与以往相同:它将Test变成一个对象 ,该对象可以以与应用方法相同的方式应用于括号中的参数。因此,您可以编写Test(" Learnfk"," gmail.com")来构造字符串" [email protected]"。
unapply 方法将Test类转换为 extractor ,并颠倒了 apply 的构造过程,其中apply接受两个字符串并组成一个电子邮件地址字符串,unapply接受一个电子邮件地址并返回可能的两个字符串:该地址的 user 和 domain 。
Extractors - 语法
unapply("[email protected]") equals Some("Learnfk", "gmail.com") unapply("Learnfk Ali") equals None
以下示例程序显示了电子邮件地址的提取器对象 。
Extractors - 示例
object Demo { def main(args: Array[String]) { println ("Apply method : " + apply("Learnfk", "gmail.com")); println ("Unapply method : " + unapply("[email protected]")); println ("Unapply method : " + unapply("Learnfk Ali")); } //注入方式(可选) def apply(user: String, domain: String)={ user +"@"+ domain } //提取方法(必填) def unapply(str: String): Option[(String, String)]={ val parts=str split "@" if (parts.length == 2){ Some(parts(0), parts(1)) } else { None } } }
将上述程序保存在 Demo.scala 中。以下命令用于编译和执行该程序。
\>scalac Demo.scala \>scala Demo
Apply method : [email protected] Unapply method : Some((Learnfk,gmail.com)) Unapply method : None
模式匹配
当类的后跟带有零个或多个参数的列表的括号时,编译器将对该调用 apply 方法,我们可以在对象和类中定义应用。
如上所述,它执行与 apply 应用相反的操作。使用 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 中。以下命令用于编译和执行该程序。
\>scalac Demo.scala \>scala Demo
10 10 is bigger two times than 5
参考链接
https://www.learnfk.com/scala/scala-extractors.html
标签:unapply,教程,Scala,Demo,无涯,com,apply,Learnfk,gmail From: https://blog.51cto.com/u_14033984/9437349