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对象。
scala模式匹配及样本类的更多相关文章
- Scala学习笔记——样本类和模式匹配
1.样本类 在申明的类前面加上一个case修饰符,带有这种修饰符的类被称为样本类(case class). 被申明为样本类的类的特点:1.会添加和类名一致的工厂方法:2.样本类参数列表中的所有参数隐式 ...
- Spark样本类与模式匹配
一.前言 样本类(case class)与模式匹配(pattern matching)是Scala中一个比较复杂的概念,往往让人感觉深陷泥沼.我在这里对Scala中的样本类与模式匹配进行了一些整理,希 ...
- scala学习笔记(四)样本类与模式匹配
访问修饰符 格式:private[x]或protected[x],x指某个所属包.类或单例对象,表示被修饰的类(或方法.单例对象),在X域中公开,在x域范围内都可以访问: private[包名]:在该 ...
- Scala学习文档-样本类与模式匹配(match,case,Option)
样本类:添加了case的类便是样本类.这种修饰符可以让Scala编译器自动为这个类添加一些语法上的便捷设定. //样本类case class //层级包括一个抽象基类Expr和四个子类,每个代表一种表 ...
- scala模式匹配与样例类
样本类:添加了case的类便是样本类.这种修饰符可以让Scala编译器自动为这个类添加一些语法上的便捷设定.如下: 1.添加与类名一致的工厂方法.也就是说,可以写成Var("x") ...
- scala 模式匹配详解 2 scala里是怎么实现的?
在这篇martin和另外两位模式匹配领域专家的论文里说了模式匹配的几种实现方式,以及scala是选择哪种方式来实现的.http://lampwww.epfl.ch/~emir/written/Matc ...
- Scala模式匹配| 隐式转换
1. 模式匹配 Scala中的模式匹配类似于Java中的switch语法,但是更加强大.模式匹配语法中,采用match关键字声明,每个分支采用case关键字进行声明,当需要匹配时,会从第一个case分 ...
- scala模式匹配详细解析
一.scala模式匹配(pattern matching) pattern matching可以说是scala中十分强大的一个语言特性,当然这不是scala独有的,但这不妨碍它成为scala的语言的一 ...
- Spark记录-Scala模式匹配
Scala模式匹配 模式匹配是Scala函数值和闭包后第二大应用功能.Scala为模式匹配提供了极大的支持,处理消息. 模式匹配包括一系列备选项,每个替代项以关键字大小写为单位.每个替代方案包括一个模 ...
随机推荐
- VS开发入门一:VS常用快捷键大全,工欲善其事必先利其器 只看标红的吧
1.快速using(这个的快捷键是ctrl+.)2.快速回到之前编辑的代码页面现在的项目动不动就几十个代码页面,经常需要在几个页面之间跳来跳去,这时就需要这两个快捷键:CTRL + - 向后定位,回到 ...
- 使用 EF Core 的 EnableRetryOnFailure 解决短暂的数据库连接失败问题
阿里云服务器有时会出现短暂的连接不上数据库服务器(RDS)的问题,之前由于没有启用 Entity Framework Core 的失败重试功能(默认是禁用的),短暂的连接失败立马会引发下面的异常从而出 ...
- 颜色模式、DPI和PPI、位图和矢量图
颜色模式:用于显示和打印图像的颜色模型 RGB:电子设备的颜色 CMYF:印刷的颜色 印刷的图像分辨率大于等于120像素/厘米,300像素每英寸 图像分辨率单位为PPI(每英寸像素Pixel per ...
- 解决Windows下文件在Linux下打开出现乱码的问题
目录 问题 原理 解决 总结 参考资料 问题 前几天生病了,Java一直在看代码但是没跟着打,于是决定偷一波小小的懒,直接把教材的代码从Windows通过共享文件夹放到了Linux里面.但是编译的时候 ...
- 家庭记账本之微信小程序(三)
继上篇注册阶段后,经过查阅资料学习后,以下介绍开发阶段 1.登录微信公众平台就能在菜单“开发”---“基本配置”中看到小程序的AppID了. 小程序的 AppID 相当于小程序平台的一个身份证,后续你 ...
- c#XML转换成实体
首选:我的XML文件如下(mysql表里导出的):几千条,就选2条做例子. <?xml version="1.0" encoding="utf-8" ?& ...
- Spring框架第二天
## Spring框架第二天 ## ---------- **课程回顾:Spring框架第一天** 1. 概述 * IOC和AOP 2. 框架的IOC的入门 * 创建applicationContex ...
- Maven 编译跳过检查
Maven 编译跳过检查 使用maven打包的时候指令:clean package, 但过程可会有提示检测错误,如果想跳过检查,需加上:-Dmaven.test.skip=true 完整指令: cle ...
- 修改caffe层的一般流程
https://blog.csdn.net/u012273127/article/details/78701161
- keepalived weight正负值问题(实现主服务器nginx故障后迅速切换到备服务器)
有两台负载均衡,lb01,lb02. lb02, priority值为100 编辑keepalived配置文件 vim /etc/keepalived/keepalived.conf ! Con ...