zoukankan      html  css  js  c++  java
  • scala模式匹配及样本类

    样本类

      1、带有case关键字的类被称为样本类;

        例如:abstract class Expr

                  case class Var(name: String) extends Expr

                  case class Number(num: Double) extends Expr

           case class UnOp(operator:String,arg: Expr) extends Expr

                  case class BinOp(operatot: String,left:Expr,right:Expr) extends Expr

      2、样本类的特点

           1)增加与类名一致的工厂方法。即可以将构造的类由new Var("x")该为Var("x");

        2) 样本类参数列表中的所有参数隐式的获得了val前缀,被当作字段维护;

        3)编译器为你的类添加方法toString、hashCode、equals的自然实现,“==”符号直接转换为equals方法。

    模式匹配

       样本类可以进行模式匹配

       例如如下样本类匹配函数:

        def simplifyTop(expr: Expr):Expr = expr match{

          case UnOp("-",UnOp("-",e)) => e  

                case BinOp("+",e,Number(0)) => e

                case BinOp("*",e,Number(1)) => e

                case _ => expr

        }

        匹配格式:选择器 match {备选项}

        模式匹配以值作为结果,并且匹配到一个不会进行后面的匹配,如果没有模式匹配会抛出MatchError的异常。

    模式匹配的种类

        通配模式 :使用"_"匹配任意对象

        常量模式 :常量模式仅仅匹配自身 (val变量或者单例对象也被看作常量,Nil匹配空列表的形式)

       变量模式 :变量模式类似于通配符,可以匹配任意对象

        构造器模式 :构造器作为匹配项进行匹配,检查方式:首先检查对象是该名称的样本类成员,然后检查对象构造器参数类型。

          序列模式 : 可以匹配某一个序列格式,例如匹配项为 List(0,_*) ,匹配一个不指定长度的序列

          元祖模式 : 还可与匹配元组,例如 (a,b,c)这样的模式

          类型模式 :可以把类型模式当做类型测试以及类型转换的简单替代 ,例如:s : String => s.length 匹配一个String类型转换                                为一个Int类型(类型模式里的“_”代表任何类型)

    擦除模式

      模式匹配中的擦除模式指的是类型参数信息没有保存到运行期,因此对于类型Map[Int,Int]无法匹配。

    变量绑定

      将一个变量与一个模式绑定,即为变量绑定模式,这种模式的意义在于他能像通常的那样做模式匹配。例如UnOp(“abs”,e @ UnOp("abs",_)) => e ,匹配成功,那么符合UnOp(“abs”,_)部分就可以使用e指代,之后e就会保持原样被返回。

    模式守卫

      模式是线性的,模式变量仅允许在模式中出现一次, 可以使用模式匹配重新制定规则,在匹配是加上判断条件                      例如 case n :Int if 0 < n  匹配正整数

    模式重叠

      模式匹配中如果上一个模式匹配覆盖下一个模式匹配,或者匹配覆盖那么就会报错。可以调整匹配顺序。

    封闭类

      封闭类就是让类是封闭的,将一个超类定义为一个封闭类,子类继承超类,定义一个超类类型的匹配变量,如果匹配选项没有包含所有继承超类的子类,编译器就会报错。定义封闭类的方式在类名前加上sealed 修饰。

    Option类型:

      Option(x):如果x非空,返回 some(x),如果为空,返回None对象。

       

  • 相关阅读:
    CodeForces 785D Anton and School
    CodeForces 785C Anton and Fairy Tale
    CodeForces 785B Anton and Classes
    CodeForces 785A Anton and Polyhedrons
    爱奇艺全国高校算法大赛初赛C
    爱奇艺全国高校算法大赛初赛B
    爱奇艺全国高校算法大赛初赛A
    EOJ 3265 七巧板
    EOJ 3256 拼音魔法
    EOJ 3262 黑心啤酒厂
  • 原文地址:https://www.cnblogs.com/moss-yang/p/7290721.html
Copyright © 2011-2022 走看看