具有名为unapply成员方法的对象叫抽取器(An extractor in Scala is an object that has a method called unapply as one of
its members. )。unapply方法的目的是为了分解值。unapply叫做抽取方法,有了抽取方法的Object就是抽取器。
unapply方法可有两种返回值类型:Option[T]和Boolean。返回值类型是Option[T]时,若返回None,认为匹配不成功。 unapply方法返回值类型是Boolean时,返回false,认为匹配不成功。
上图中,有两个模式匹配,第一个为抽取器的模式匹配,第二个为普通的值匹配,二者得到的结果相同(图右为输出)。思考方式为,通过unapply的方法验证匹配是否成功(返回Some()或true),“case Email”后面的“(u,d)”看作为了在后面表达式中使用它们而绑定的值。
下面再举一个复杂一点的抽取器:
object Twice { def apply(s: String): String = s + s def unapply(s: String): Option[String] = {
val length = s.length / 2 val half = s.substring(0, length) if (half == s.substring(length)) Some(half) else None
}
}
object UpperCase { def unapply(s: String): Boolean = s.toUpperCase == s
}
def userTwiceUpper(s: String) = s match { case EMail(Twice(x @ UpperCase()), domain) =>
"match: "+ x +" in domain "+ domain case _ =>
"no match"
}