scala学习十四 模式匹配

来源:互联网 发布:阿里云qq群 编辑:程序博客网 时间:2024/04/28 03:53

模式匹配详解:

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 matchtestclass accountcase class account1(double: Double) extends accountcase class account2(double: Double, double2: Double) extends accountcase object Nothing extends accountclass 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 matchtestsealed class account     //加了sealed 在对account的扩展只有在本文件有效case class account1(double: Double) extends accountcase class account2(double: Double, double2: Double) extends accountcase object Nothing extends accountclass 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")    }  }}




0 0