作者:摇摆少年梦
视频地址:http://www.xuetuwuyou.com/course/12
本节主要内容
- apply与unapply方法
- 零变量或变量的模式匹配
- 提取器与序列模式
- scala中的占位符使用总结
1. apply与unapply方法
apply方法我们已经非常熟悉了,它帮助我们无需new操作就可以创建对象,而unapply方法则用于析构出对象,在模式匹配中特别提到,如果一个类要能够应用于模式匹配当中,必须将类声明为case class,因为一旦被定义为case class,scala会自动帮我们生成相应的方法,这些方法中就包括apply方法及unapply方法。本节将从提取器(也称析构器)的角度对unapply方法进行介绍。先看下面的这个例子(来源于programmin in scala)
object EMail{
//apply方法用于无new构造对象
def apply(user: String, domain: String) = user + "@" + domain
//unapply方法用于在模式匹配中充当extractor
def unapply(str: String): Option[(String, String)] = {
val parts = str split "@"
if (parts.length == 2) Some(parts(0), parts(1)) else None
}
}
object ApplyAndUnapply {
val email=EMail("zhouzhihubeyond","sina.com")
//下面的匹配会导致调用EMail.unapply(email)
case EMail(user,domain) => println("user="+user+" domain="+domain)
}
}
在上述的代码中,我们将unapply方法定义为:
def unapply(str: String): Option[(String, String)] = {
val parts = str split "@"
if (parts.length == 2) Some(parts(0), parts(1)) else None
}
这是有道理的,原因在于可能会有不合法的email用于模式匹配,例如:
object ApplyAndUnapply extends App{
def patternMatching(x:String)=x match {
//下面的匹配会导致调用EMail.unapply(email)
case EMail(user,domain) => println("user="+user+" domain="+domain)
//匹配非法邮箱
case _ => println("non illegal email")
}
val email=EMail("zhouzhihubeyond","sina.com")
patternMatching(email)
patternMatc