unapply
For matching only, not for other output. Returns a Boolean value
object UpperCase { def unapply(s: String): Boolean = s.toUpperCase == s } val s = "AA" s match { case x @ UpperCase() => println(x) case _ => "other" }
Matching internal data. Return Option [Tuple] (with a similar case class)
object Email { 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 } } private val e = Email("23", "qq.com") println(e)
unapplySeq
Internal data match, return Option [Seq]
object Domain{ def apply(parts:String *) :String = parts.reverse.mkString(".") def unapplySeq(whole:String): Option[Seq[String]] = Some(whole.split("\\.").reverse) } val Domain(p, _*) = Domain("com", "xiangzhi", "c") println(p)
Regular Expressions
Matched capturing group returned parameters (similar with the case class)
val date = "(\\d{4})-(\\d{2})-(\\d{2})".r val p = "2004-01-20" match { case date(year, _*) => s"$year was a good year for PLs." } println(p)
233