模式匹配详解:
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')
}
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")
}
}
}