pattern matching scala

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

Guess you like

Origin www.cnblogs.com/lemos/p/11945228.html