模式匹配详解:
package matchtest; class matchtest { var d:Int=0; def mat(a: Int) { a match { case 1 => print(a + "*" * a+"第一个方法") case ch if Character.isDigit(ch) => print("自动赋值给ch"+ch); case _ => print("默认的方法,如果上面的都没有匹配"); } } } object matchtest extends App{ val matest=new matchtest matest.mat('1') }
类型的匹配(并将值赋给case后面的变量)
package matchtest; class matchtest { var d:Int=0; def mat(a: Int) { a match { case 1 => print(a + "*" * a+"第一个方法") case ch if Character.isDigit(ch) => print("自动赋值给ch"+ch); case _ => print("默认的方法,如果上面的都没有匹配"); } } def mat2(ref:Any){ ref match { case a:Int =>print("这个是int") case b:String =>print("这个是string") case _ =>print("这个不再匹配的范围") } } } object matchtest extends App{ val matest=new matchtest matest.mat2("ssss") }
注意:当要使用模式匹配去匹配特定的map是:Map[ int,String ] 别这样做,应为jvm在运行时会擦出类型信息,但是做一个统一的匹配是可以的 case m:Map[ _, _ ] =>xxxx
数组的匹配和列表的匹配:
def mat3(a: Array[Any]) { a match { case Array(0) => { print("匹配包含0这个元素的数组") } case Array(x, y) => { print("匹配只包含两个元素的数组") } case Array(x, _*) => { print("匹配以0开头的数组") } } } def mat4(a: List[Any]) { a match { case 0 :: Nil => { print("匹配包含0这个元素的数组") } case x :: y :: Nil => { print("匹配只包含两个元素的数组") } case 0 :: tail => { print("匹配以0开头的数组") } case _ =>print("默认匹配") } }
样例类的作用(匹配具体的子类,在给出具体的行为):
package matchtest class account case class account1(double: Double) extends account case class account2(double: Double, double2: Double) extends account case object Nothing extends account class acco { def mat(acc: account) { acc match { case account1(a) => print("a"+a) case account2(a, b) => print("a:"+ a + "b"+b) case _ => print("xxx") } } }
当在使用样例类进行匹配的时候,可能需要编译器帮助盘但样例类是否全面,则需要在基类前加 sealed 关键字
package matchtest sealed class account //加了sealed 在对account的扩展只有在本文件有效 case class account1(double: Double) extends account case class account2(double: Double, double2: Double) extends account case object Nothing extends account class acco { def mat(acc: account) { acc match { case account1(a) => print("a"+a) case account2(a, b) => print("a:"+ a + "b"+b) case _ => print("xxx") } } }