敏捷硬件开发语言Chisel与数字系统设计 课件 第16章 模式匹配_第1页
敏捷硬件开发语言Chisel与数字系统设计 课件 第16章 模式匹配_第2页
敏捷硬件开发语言Chisel与数字系统设计 课件 第16章 模式匹配_第3页
敏捷硬件开发语言Chisel与数字系统设计 课件 第16章 模式匹配_第4页
敏捷硬件开发语言Chisel与数字系统设计 课件 第16章 模式匹配_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

16.模式匹配一、样例类和样例对象二、模式匹配三、模式的种类四、模式守卫五、密封类六、可选值七、偏函数2目

录一、样例类和样例对象3定义

在最前面加上关键字“case”,那么这个类就被定义为样例类。特点①添加一个与类同名的工厂方法。②参数列表的每个参数都隐式地获得了一个val前缀。③能够内置实现toString、hashCode和equals方法。④添加一个copy方法。一、样例类和样例对象1.1样例类4可以通过“类名(参数)”构造对象类内部会自动添加与参数同名的公有字段只需通过传入具名参数和缺省参数,即可构造与旧对象只有某些字段不同的新对象objectA.copy(arg0=10)例如:二、样例类和样例对象5scala>caseclassStudents(name:String,score:Int)

classStudents

scala>valstu1=Students("Alice",100)

stu1:Students=Students(Alice,100)

scala>stu1.name

res0:String=Alice

scala>stu1.score

res1:Int=100样例类内部会自动添加与参数同名的公有字段1.1样例类二、样例类和样例对象样例类中有默认的copy、toString、hashCode、equals方法。6scala>valstu2=stu1.copy()

stu2:Students=Students(Alice,100)

scala>stu2==stu1

res2:Boolean=true

scala>valstu3=stu1.copy(name="Bob")

stu3:Students=Students(Bob,100)

scala>stu3==stu1

res3:Boolean=false调用equals方法,用==来比较两个样例类的所有字段值是否相等1.1样例类定义

用“case”修饰的单例对象被称为样例对象。格式特点没有参数和构造方法样例对象具备样例类的特性,相当于一个无参、无构造方法的样例类一、样例类和样例对象1.1样例对象7caseobject样例对象名二、模式匹配8格式二、模式匹配9选择器match{

case

模式1=>

表达式1case模式2=>

表达式2

case

模式3=>

表达式3…

}选择器就是待匹配的对象每个可选分支都开始于关键字case,包括一个模式和一到多个表达式“=>”隔开了模式和表达式执行流程二、模式匹配10选择器match{

case

模式1=>

表达式1case模式2=>

表达式2

case

模式3=>

表达式3…

}

从上到下,如果匹配成功就执行=>后面的表达式,返回结果

如果表达式有多个,则按顺序执行直到下个case语句为止如果匹配不成功就往后判断下一个case

要确保至少有一个模式匹配成功,否则会抛出MatchError异常三、模式的种类11通配模式用下划线“_”表示,它会匹配任何对象。通配模式通常放在末尾用于缺省、捕获所有可选路径。如果某个模式需要忽略局部特性,也可以用下划线代替。三、模式的种类3.1通配模式12scala>deftest(x:Any)=xmatch{

|caseList(1,2,_)=>true

|case_=>false

|}

test:(x:Any):Boolean

scala>test(List(1,2,3))

res0:Boolean=true

scala>test(List(1,2,10))

res1:Boolean=true

scala>test(List(1,2))

res2:Boolean=false含有三个元素,且前两个为1、2,第三个元素任意的列表用一个常量作为模式,常量模式只能匹配常量自己。任何字面量、val类型的变量、单例对象(样例对象)都可以作为常量模式。三、模式的种类3.2常量模式13scala>deftest2(x:Any)=xmatch{

|case5=>"five"

|casetrue=>"truth"

|case"hello"=>"hi!"

|caseNil=>"theemptylist"

|case_=>"somethingelse"

|}

test2:(x:Any)String

scala>test2(List())

res0:String=theemptylistscala>test2(5)

res1:String=five

scala>test2(true)

res2:String=truth

scala>test2("hello")

res3:String=hi!

scala>test2(233)

res4:String=somethingelse变量模式就是一个变量名,它可以匹配任何对象。变量模式可以放在最后面代替通配模式。变量模式还会把变量名与匹配成功的输入对象绑定,在表达式中可以通过这个变量名来进一步操作输入对象。三、模式的种类3.3变量模式14scala>deftest3(x:Any)=xmatch{

|case0=>"Zero!"

|casesomethingElse=>"NotZero:"+somethingElse

|}

test3:(x:Any)String

scala>test3(0)

res0:String=Zero!

scala>test3(List(0))

res1:String=NotZero:List(0)构造方法模式是把样例类的构造方法作为模式,形式为“样例类名(模式)”。三、模式匹配的种类3.4构造方法模式15scala>caseclassA(x:Int)

classA

scala>caseclassB(x:String,y:Int,z:A)

classB

scala>deftest5(x:Any)=xmatch{

|

caseB("abc",e,A(10))=>e+1

|

case_=>

|}

test5:(x:Any)AnyValscala>vala=B("abc",1,A(10))

a:B=B(abc,1,A(10))

scala>valb=B("abc",1,A(1))

b:B=B(abc,1,A(1))

scala>test5(a)

res0:AnyVal=2

scala>test5(b)

res1:AnyVal=()检查待匹配的对象是否为这个样例类的对象匹配顺序:检查待匹配的对象的构造方法参数是否为匹配括号里的“模式”序列模式可以和序列类型匹配,比如List或Array。可以用下划线“_”或变量模式指出不关心的元素。3.“_*”放在最后可以匹配任意个数的元素。三、模式匹配的种类3.5序列模式16scala>deftest6(x:Any)=xmatch{

|caseArray(1,_*)=>"OK!"

|case_=>"Oops!"

|}

test6:(x:Any)String

scala>test6(Array(1,2,3))

res0:String=OK!

scala>test6(1)

res1:String=Oops!元组也可以用于模式匹配,在圆括号里可以包含任意模式。三、模式匹配的种类3.6元组模式17scala>deftest7(x:Any)=xmatch{

|case(1,e,"OK")=>"OK,e="+e

|case_=>"Oops!"

|}

test7:(x:Any)String

scala>test7(1,10,"OK")

res0:String=OK,e=10格式:模式定义时声明具体的数据类型。带类型的模式可以用来类型测试和类型转换。三、模式匹配的种类3.7带类型的模式18scala>deftest8(x:Any)=xmatch{

|cases:String=>s.length

|casem:Map[_,_]=>m.size

|case_=>-1

|}

test8:(x:Any)Int

scala>test8("abcd")

res0:Int=4

scala>test8(Map(1->'a',2->'b'))

res1:Int=2

scala>test8(8)

res2:Int=-1除了变量模式外,我们还可以对任何其他模式添加变量,构成变量绑定模式。其形式为“变量名@模式”。如果匹配成功,会把匹配的对象赋给这个变量。三、模式匹配的种类3.8变量绑定模式19scala>deftest9(x:Any)=xmatch{

|case(1,2,e@3)=>e

|case_=>0

|}

test9:(x:Any)Int

scala>test9(1,2,3)

res0:Int=3四、模式守卫204.1基本介绍四、守卫模式模式守卫出现在模式之后,是一条用if开头的语句。如果存在模式守卫,那么必须模式守卫返回true,模式匹配才算成功。21casei:Intifi>0=>...

//只匹配正整数

cases:Stringifs(0)=='a'=>...

//只匹配以字母'a'开头的字符串

case(x,y)ifx==y=>...

//只匹配两个元素相等的二元组

五、密封类22五、密封类定义:sealed

class类名作用:密封类只能在同一个文件中定义子类,不能在文件之外被别的类继承。用法:将样例类的超类定义为密封类,有助于编译器检查模式匹配的完整性。因为这样确保了不会有新的模式随意出现,而只需要关心本文件内已有的样例类。23如何让编译器知道所有可能的case呢?六、可选值24六、可选值可选值:类型为Option[T]的一个值。25问题一:每条case分支可能返回不同类型的值,导致函数的返回值或变量的类型不好确定,该如何把它们统一起来?问题二:通配模式下,常常不需要返回一个值,但什么都不写又不太好。标准库里的一个密封抽象类,A可为任意类型六、可选值可选值的表现形式26None:表示无值,类型是Option[Nothing],是所有Option[T]类型的子类。Some(x):表示具体的值

,通过“Some(x)”可以构造一个Some类的对象,其中参数x是一个具体的值。根据x的类型,可选值的类型会发生改变。eg:Some(10)的类型是Option[Int],Some("10")的类型是Option[String]。七、偏函数27七、偏函数28格式一个case语句就是函数的一个入口,多个case语句就是多个入口,每个case语句又可以有自己的参数列表和函数体。定义偏函数是类型为PartialFunction[A,B]

的对象。作用划分一个输入参数的可行域:在可行域内对入参执行一种操作,在可行域之外对入参执行其他操

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论