• 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对象。

       

  • 相关阅读:
    Filebeat 日志收集器 安装和配置
    纠错式教学法对比鼓励式教学法 -----Lily、贝乐、英孚,乐加乐、剑桥国际、优学汇、北外青少
    硅谷夜谈
    指路Reactive Programming
    Spring WebFlux 要革了谁的命?
    flink部署操作-flink standalone集群安装部署
    Flink的高可用集群环境
    当怪物来敲门 经典台词
    浅析几种线程安全模型
    最详细的排序解析,理解七大排序
  • 原文地址:https://www.cnblogs.com/moss-yang/p/7290721.html
Copyright © 2020-2023  润新知