返回首页 Scala 专题教程

模式的种类(二)

构造器模式

构造器模式功能非常强大,比如一个构造器模式可以定义为 BinOp(“+”,e,Number(0))。它由一个名称 BinOp(某个 case class 的名称)和一系列有括号分开的模式构成(“+”,e 和 Number(0))。这个模式首先检查输入对象是否是 BinOp 类型的对象,然后检查构造器参数是否匹配输入的对象。

这些额外的模式表示 Scala 支持深度匹配,这些模式不仅仅检查最高层次的匹配,并且检查其内部内容的匹配,同时这些额外的模式自身还可以说构造器模式,因此你可以构造嵌套任意层次的构造器模式。 比如

    expr match{
        case BinOp("+",e,Number(0)) => println(" a deep match")
        case _ =>
    }

它的第三个参数 Number(0) 自身也是一个构造器模式,其参数又匹配 0,因此有三个层次的匹配。

序列模式

你也可以匹配如 List 和数组等序列类型的数据。和匹配 case class 语法类似,但你可以指明序列中任意数量的元素。比如:

下面的例子匹配含三个元素,其中首元素为 0 的列表:

    scala> List(0,2,4) match{
     | case List(0,_,_) => print ("found it " )
     | case _ =>
     | }
    found it 

如果你需要匹配一个未指明长度的序列,可以使用“_*” 作为模式的后一元素,这个“_*” 可以匹配任意数目的元素(包括 0 个元素)

    expr match{
      case List(0,_*) => print ("found it")
      case _ =>
      }

多元组模式

除序列外,你可以匹配多元组,比如:

    scala> def tupleDemo(expr:Any) =
     | expr match{
     |   case (a,b,c) => print("matched " + a +":" +b +":"+c )
     |   case _ =>
     | }
    tupleDemo: (expr: Any)Unit

    scala> tupleDemo(2,3,4)
    matched 2:3:4