scala总结之模式匹配

scala的模式匹配有点类似于java里面的switch,不过比java的switch更加简洁强大

一,简单匹配

一个简单例子:

def main(args: Array[String]): Unit = {
    val inPut = 0
    inPut match {
      case 0 => println("匹配值为0")
      case 1 => println("匹配值为1")
    }
  }

这个例子和java中的switch类似如果把inPut值改为3,会抛出MatchError

下面以一个例子来说明match的语法特性

def main(args: Array[String]): Unit = {
    for{
      x <- Seq(1,2,2.7,"one","two",'four)
    }{
      val str = x match {
        case 1        => "int 1"
        case _:Int    => "other int:"+x
        case _:Double =>"a double :"+x
        case "one"    => "string one"
        case _:String =>"other string:"+x
        case _        =>"unexpected value"+x
      }
      println(str)
    }
  }
//  执行结果
//  int 1
//  other int:2
//  a double :2.7
//  string one
//    other string:two
//  unexpected valueSymbol(four)

由于X是ANY类型,所以必须有个匹配下限可以保证不抛出MatchError

下面再举一个例子来说明变量匹配中一个值得注意的地方

def main(args: Array[String]): Unit = {
    def checkY(y:Int): Unit ={
      for {
        x <- Seq(99, 100, 101)
      } {
        val str = x match {
          case y => "found y!"
          case i: Int => "int: "+i
        }
        println(str)
      }
    }
    checkY(100)
  }
//  执行结果
//	found y!
//	found y!
//	found y!

在这个例子中,我们预期得到的结果是
int: 99
found y!
int: 101
但是程序的执行结果和我们预期不符,为什么?
case y在这个例子里面的意思是,匹配任意输入的意思,如果我们想用case y去匹配变量,那么需要在y上面加上反引号

在case中,小写字母代表的是待提取的变量,加上反引号才代表引用的之前的值,如果大写字母代表的是类型

上一篇:Centos6进入单用户模式的两种方法


下一篇:题解 P4289 【[HAOI2008]移动玩具】