|
Ò».scalaģʽƥÅ䣨pattern matching£©
pattern matching¿ÉÒÔ˵ÊÇscalaÖÐÊ®·ÖÇ¿´óµÄÒ»¸öÓïÑÔÌØÐÔ£¬µ±È»Õâ²»ÊÇscala¶ÀÓе쬵«Õâ²»·Á°Ëü³ÉΪscalaµÄÓïÑÔµÄÒ»´óÀûÆ÷¡£
scalaµÄpattern matchingÊÇÀàËÆÕâÑùµÄ£¬
e match {
case Pattern1 => do Something
case Pattern2 if-clause => do others
...
}
ÆäÖУ¬±äÁ¿eºóÃæ½ÓÒ»¸ömatchÒÔ¼°Ò»¸ö´úÂë¿é£¬ÆäÖÐÿ¸öcase¶ÔÓ¦Ò»ÖÖ¿ÉÄÜ»ØÆ¥ÅäµÄÀàÐÍ£¬Èç¹ûÆ¥Åä³É¹¦ÔòÖ´ÐÐ=>ºóÃæµÄ´úÂë¡£
ÎÒÃÇ¿ÉÒÔÓÃÒ»¸ö¾ßÌåһЩµÄÀý×ÓÀ´¿´¿´Ä£Ê½Æ¥ÅäÊÇÔõô¹¤×÷µÄ£º
case class Player(name: String, score: Int)
def printMessage(player: Player) = player match {
case Player(_, score) if score > 100000 =>
println("Get a job, dude!")
case Player(name, _) =>
println("Hey, $name, nice to see you again!")
}
¿´ÆðÀ´ÓеãÀàËÆÓÚÆäËûÓïÑÔµÄswitch£¬µ«Æäʵ»¹ÊÇÓкܴóµÄ²»Í¬µÄ¡£
ÒÔjavaµÄswitchΪÀý£¬javaµÄswitch½ö½ö»á×öһЩ»ù±¾ÀàÐÍµÄÆ¥Å䣬ȻºóÖ´ÐÐһЩ¶¯×÷£¬²¢ÇÒÊÇûÓзµ»ØÖµµÄ¡£
¶øscalaµÄpattern matching matchÔòҪǿ´óµÃ¶à£¬³ýÁË¿ÉÒÔÆ¥ÅäÊýÖµ£¬Í¬Ê±Ëü»¹ÄÜÆ¥ÅäÀàÐÍ¡£
def parseArgument(arg: String) = arg match {
//Æ¥ÅäÖµ
case "-h" | "--help" => displayHelp
case "-v" | "--version" => displayVerion
case whatever => unknownArgument(whatever)
}
def f(x: Any): String = x match {
//Æ¥ÅäÀàÐÍ
case i:Int => "integer: " + i
case _:Double => "a double"
case s:String => "I want to say " + s
}
ͬʱpattern matchingÊÇÓзµ»ØÖµµÄ£¬±ÈÈçÉÏÃæµÄmatch£¬Ëü·µ»ØµÄ¾ÍÊÇÒ»¸öUnit¡£ÎÒÃÇÒ²¿ÉÒÔÐÞ¸ÄÉÏÃæµÄ´úÂëÈÃËü·µ»ØÒ»¸ö×Ö·û´®£º
case class Player(name: String, score: Int)
def message(player: Player) = player match {
case Player(_, score) if score > 100000 =>
"Get a job, dude!"
case Player(name, _) =>
"Hey, $name, nice to see you again!"
}
ÖµµÃÒ»ÌáµÄÊÇ£¬pattern matching ·µ»ØÖµÊÇÓɵÚÒ»¸öÆ¥ÅäµÄģʽÖеĴúÂë¿é¾ö¶¨µÄ¡£
¶þ. ΪʲôҪÓÃpattern matching
¿´µ½ÕâÀïÄã»á·¢ÏÖÒ»¸öÎÊÌ⣬pattern matching²»ÊǺÍif else²î²»¶àÂð£¿ÄÇΪʲô»¹ÒªÊ¹ÓÃpattern matchingÄØ£¿
Ê×ÏÈÎÒÃÇÐèÒªÃ÷°×£¬Ä£Ê½Æ¥ÅäÆäʵ±¾ÖÊÉÏÊÇÌṩһ¸ö·½±ãµÄ½â¹¹(Destructuring)Êý¾Ý½á¹¹µÄ·½Ê½£¬ÒÔscalaΪÀý£¬pattern matchingÆäʵÓõ½ÁËscalaÖÐÌáÈ¡Æ÷µÄ¹¦ÄÜ£¬ÌáÈ¡Æ÷Æäʵ¾ÍÊÇÀàÖеÄunapply()·½·¨¡£
trait User {
def name: String
}
class FreeUser(val name: String) extends User
object FreeUser {
//ÌáÈ¡Æ÷
def unapply(user: FreeUser): Option[String] = Some(user.name)
}
val user: User = new FreeUser("Daniel")
user match {
case FreeUser(name) => println("it match here" + name)
case _ => println("not me")
}
Ã÷°×ÁËģʽƥÅäµÄ±¾ÖÊÄã¾Í»áÖ±µ½£¬Æäʵif elseÖ»ÊÇpattern matchingÖеÄÒ»¸öµäÐ͵ÄÓ÷¨£¬µ«²¢·ÇËüµÄÈ«²¿¡£
ͬʱ£¬pattern matchingÔÊÐíÄã½âñîÁ½¸ö²¢²»ÕæÕýÊôÓڱ˴˵Ķ«Î÷£¬Ò²Ê¹µÃÄãµÄ´úÂë¸üÒ×ÓÚ²âÊÔ¡£±ÈÈçÉÏÃæµÄmatch²¿·ÖµÄ´úÂëÎÒÃÇ¿ÉÒÔд³ÉÏÂÃæÕâÑù£º
val user: User = new FreeUser("Daniel")
//½«·µ»Ø½á¹û´æÔÚÒ»¸ö³£Á¿ÖÐ
val message = user match {
case FreeUser(name) => "it match here" + name
case _ => "not me"
}
//¿ÉÒÔËæÒâʹÓøó£Á¿£¬ÊµÏÖ½âñî
println(message)
ÕâÑù»á¸³Óè´úÂë¸ü¶àµÄÁé»îÐÔ£¬Í¬Ê±Ò²¸ü¼Ó·½±ã×ö½øÒ»²½²Ù×÷¡£
¶øÒԿɶÁÐԵĽǶÈÀ´Ëµ£¬Ê¹ÓÃÒ»´ó¶ÑµÄif else´úÂëÎÞÒÉÊDZȽÏÄÑ¿´µÄ£¬¶øÈç¹ûʹÓÃpattern matchingµÄ»°£¬´úÂë»á¼ò½àÇåÎúºÜ¶à£¬¶ø¼ò½àµÄ´úÂëÔò»á¸üÈÝÒ×ÔĶÁ¡£
ÒÔÉϾÍÊÇdz̸ScalaģʽƥÅäµÄÏêϸÄÚÈÝ£¬¸ü¶à¹ØÓÚscalaģʽƥÅäµÄ×ÊÁÏÇë¹Ø×¢ÉçÇøÆäËüÏà¹ØÎÄÕ£¡ |