敏捷硬件开发语言Chisel与数字系统设计 课件 第11章 Scala的变量及函数_第1页
敏捷硬件开发语言Chisel与数字系统设计 课件 第11章 Scala的变量及函数_第2页
敏捷硬件开发语言Chisel与数字系统设计 课件 第11章 Scala的变量及函数_第3页
敏捷硬件开发语言Chisel与数字系统设计 课件 第11章 Scala的变量及函数_第4页
敏捷硬件开发语言Chisel与数字系统设计 课件 第11章 Scala的变量及函数_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

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

文档简介

11.Scala的变量及函数一、Scala变量定义二、Scala的基本类型三、函数及其几种形式目

录22一、Scala变量定义31.2如何定义一个变量定义一个变量时,需要在变量名前面添加关键字“var”或者“val”;“var”定义的变量,可以重新赋予新的值,并且重新赋值时不需要加“var”;“val”定义的变量,则禁止被重新赋值。一、Scala变量定义41.1变量名的形式Scala推荐使用“驼峰命名法”变量名可以是任意的字母、数字和下划线的组合,但是不能以数字开头例如,“valisOne”,“classMyClass”一、Scala变量定义51.2.1合法变量定义在首次定义变量时,就必须赋予具体的值来初始化。一、Scala变量定义scala>valx

x=1

scala>varx

x=1scala>valx=1

x:Int=1

scala>valmsg="Hello,world!"

msg:String=Hello,world!错误定义!!!正确定义形式61.2.2“var”和“val”定义案例一、Scala变量定义val类型的变量则直接禁止重新赋值。var类型的变量在重新赋值时,新值必须和旧值是同一个类型,否则会发生类型匹配错误。scala>valx=1

valx:Int=1

scala>x=10scala>varx=1

x:Int=1

scala>x=10

scala>x="abc"71.2.3其余变量定义案例一、Scala变量定义赋给多个变量相同的值,在一条语句里用逗号间隔的变量名即可,不必逐条定义。Scala变量定义具有覆盖性。scala>vala,b,c=1

a:Int=1

b:Int=1

c:Int=1scala>valx=1

valx:Int=1

scala>valx=10

valx:Int=10

scala>x

valres0:Int=10

81.3注意事项赋给变量的对象存在可变与不可变之分。即分清楚是变量指向的对象本身发生了改变,还是变量指向了新的对象。Scala提倡定义val类型的变量,因为它是函数式编程,而函数式编程的思想之一就是传入函数的参数不应该被改变。Scala也允许指令式编程,因而预留了var类型的变量,尽管并不推荐使用。一、Scala变量定义9二、Scala的基本类型102.1基本类型二、Scala的基本类型Scala标准库定义了九种基本类型,如下表所示。除了“String”类型在java.lang包之外,其余都在Scala的包里。Scala的基本类型Byte8-bit有符号整数,补码表示,范围是-27到27-1Short16-bit有符号整数,补码表示,范围是-215到215-1Int32-bit有符号整数,补码表示,范围是-231到-231-1Long64-bit有符号整数,补码表示,范围是-263到-263-1Char16-bit无符号字符,Unicode编码,范围是0到216-1String字符串Float32-bit单精度浮点数,符合IEEE754标准Double64-bit双精度浮点数,符合IEEE754标准Boolean布尔值,其值为true或者false112.2定义变量类型二、Scala的基本类型Scala的编译器具有自动推断变量类型的功能。如果要显式声明变量的类型,或者无法推断时,则只需在变量名后面加上一个冒号“:”,然后在等号与冒号之间写出类型名即可。scala>valx:Int=123

valx:Int=123

scala>valy:String="123"

valy:String=12312二、Scala的基本类型2.3三种字面量整数字面量整数默认情况下推断为Int类型。而Byte和Short则需要定义变量时显式声明。结尾有l或者L为Long类型。默认是十进制,若以“0x”或者“0X”开头,则被认为是十六进制。scala>vala=100

a:Int=100scala>vald=200L

d:Long=200scala>valb=0X123Abc

b:Int=1194684valc:Byte=15

c:Byte=15不能超过类型的表示范围!13二、Scala的基本类型2.3三种字面量浮点数字面量都是十进制的,类型默认是Double类型。在末尾添加E和整数来表示10的N次幂。在变量末尾加大小写的D或者F来表示是哪种类型。scala>vala=1.2E3

a:Double=1200.0scala>valb=-3.2f

b:Float=-3.2注意:Double类型的字面量不能赋给Float类型的变量!!!14二、Scala的基本类型2.3三种字面量字符与字符串字面量字符字面量:以单引号包起来的一个字符。可以用‘\u编码号’的方式来构造一个字符。支持转义字符。scala>vala=‘D’

a:Char=Dscala>valb=‘\u0041'

b:Char=Ascala>vald=‘\\’

d:Char=\15二、Scala的基本类型2.3三种字面量字符与字符串字面量字符串字面量:用双引号“

”包起来的字符序列,长度任意。允许掺杂转义字符。scala>vala="\\\\\\"

a:String=\\\162.4字符串插值二、Scala的基本类型字符串插值使表达式可以被嵌入字符串字面量中并被求值。第一种形式是s插值器,即在字符串的双引号前加一个s,形如s“…${表达式}…”。识别转义字符。scala>valname="ABC"

name:String=ABC

scala>println(s"$nameDEFG")

ABCDEFGscala>s"Sum=${1+10}"

res0:String=Sum=11scala>s"\\\\"

res1:String=\\172.4字符串插值二、Scala的基本类型第二种形式是raw插值器,与s插值器类似,不识别转义字符。第三种形式是f插值器,允许给内嵌的表达式加上printf风格的指令,指令放在表达式之后并以百分号开始。scala>raw"\\\\"

res2:String=\\\\scala>printf(f"${math.Pi}%.5f")

3.1415918三、函数及其几种形式193.1定义函数三、函数及其几种形式defmax(x:Int,y:Int):Int={

if(x>y)

x

else

y}用“def”开始函数定义函数名参数名及参数类型函数返回结果的类型等号花括号里定义函数体20分号推断代码中语句末尾分号是可选的,编译器会自动推断分号。不会推断出分号的情况:①句末以非法结尾字符结尾;②下一行的句首是以非法起始字符开始;③跨行出现的圆括号对“()”或者方括号对“[]”。建议一行只写一条完整的语句,句末分号省略,让编译器自动推断。3.1定义函数三、函数及其几种形式21函数的返回结果“return”关键字也是可选的。编译器会自动为函数体里的最后一个表达式加上“return”,将其作为返回结果。返回结果的类型根据参数类型和返回的表达式来自动推断。返回结果为Unit,表示没有值返回。如果显式声明为Unit类型的函数,无论如何也不会把表达式的结果返回。3.1定义函数三、函数及其几种形式22等号与函数体函数体是用花括号包起来,包括多条语句,并自动推断分号、返回最后一个表达式。Scala的函数定义还有一个等号,返回类型没有声明时,等号甚至也可以省略。但建议不要省略等号,避免产生不必要的错误,返回类型最好也显式声明。3.1定义函数三、函数及其几种形式23无参函数如果一个函数没有参数,那么可以写一个空括号作参数列表,也可以不写。原则上,无副作用的无参函数省略括号,有副作用的无参函数添加括号,使用时需要注意。3.1定义函数三、函数及其几种形式243.2方法方法其实就是定义在类、对象、特质里面的函数,这种函数叫做“成员函数”或者“方法”,与多数oop(object-orientedprogramming)语言一样。三、函数及其几种形式253.3嵌套函数即在函数内部定义别的函数。这种函数是其外层函数独有,不能被外部调用。参数与外层函数公用。三、函数及其几种形式scala>defaddSub(x:Int,y:Int)={

|defsub(z:Int)=z-10

|if(x>y)sub(x-y)elsesub(y-x)

|}

defaddSub:(x:Int,y:Int)Int

scala>addSub(100,20)

valres0:Int=70263.4函数字面量函数是一等值,也存在字面量。其定义形式为:(参数1:参数1类型,参数2:参数2类型,...)=>{函数体}。其形式为了精简,只保留函数体,并用下划线“_”作为占位符来代替参数。而当函数字面量入参时,其形式为冒号后面加“(参数1类型,参数2类型,...)=>返回结果的类型”。三、函数及其几种形式273.4函数字面量三、函数及其几种形式scala>defaFunc(f:Int=>Int)=f(1)+1

aFunc:(f:Int=>Int)Int

scala>aFunc(x=>x+1)

res1:Int=3举例:283.5部分应用函数“def”定义的函数也有一等值的功能,只不过需要借助部分应用函数的形式来实现。部分应用函数,就是把def函数打包到一个函数值里,使它可以赋给变量,或当作函数参数进行传递。三、函数及其几种形式293.5部分应用函数举例:三、函数及其几种形式scala>defsum(x:Int,y:Int,z:Int)=x+y+z

defsum:(x:Int,y:Int,z:Int)Int

scala>vala1=sum(4,5,6)

vala:Int=15

scala>vala2=sum(4,_:Int,6)

vala2:Int=>Int=$$Lambda$1124/31807844@cc5a39

scala>a2(5)

valres0:Int=15

scala>vala3=sum_

vala3:(Int,Int,Int)=>Int=$$Lambda$1125/7905168@d10d40

scala>a3(4,5,6)

valres1:Int=15303.6闭包一个函数除了可以使用它的参数外,还能使用定义在函数以外的其他变量。函数的参数称为绑定变量,函数以外的变量称为自由变量。函数在运行期间捕获自由变量,让函数闭合,定义明确。这种函数叫闭包。自由变量必须在函数前面定义,否则编译器就找不到,会报错。三、函数及其几种形式313.6闭包三、函数及其几种形式如果捕获了某一变量,后续同名定义,则无法改变已经捕获的值。但是如果是var变量,则闭包会随着改变。varmore=1

valaddMore=(x:Int)=>x+more//addMore=x+1

more=2//addMore=x+2

varmore=10//addMore=x+2

more=-100//addMore=x+2323.7函数的特殊调用形式普通函数调用形式是按参数的先后顺序逐个传递的,但如果调用时显式声明参数名并给其赋值,则可以无视参数顺序。具名参数三、函数及其几种形式scala>defmax(x:Int,y:Int,z:Int)={

|if(x>y&&x>z)println("xismaximum")

|elseif(y>x&&y>z)println("yismaximum")

|elseprintln("zismaximum")

|}

defmax:(x:Int,y:Int,z:Int)Unit

scala>max(1,z=10,y=100)

yismaximum无视参数顺序333.7特殊函数调用形式函数定义时参数一个默认值,如果调用函数时缺省了这个参数,那么就会使用定义时给的默认值。通常和具名参数结合使用。默认参数值三、函数及其几种形式scala>defmax(x:Int=10,y:Int,z:Int)={

|if(x>y&&x>z)println("xismaximum")

|elseif(y>x&&y>z)println("yismaximum")

|elseprintln("zismaximum")

|}

defmax:(x:Int,y:Int,z:Int)Unit

scala>max(y=3,z=5)

xismaximum省略了x参数343.7特殊函数调用形式Scala允许把函数的最后一个参数标记为重复参数,其形式为在最后一个参数的类型后面加上星号“*”。意思是可以在运行时传入任意个相同类型的元素,包括零个。类型为“T*”的参数的实际类型是“Array[T]”。尽管是T类型的数组,但要求传入参数的类型仍然是T。重复参数三、函数及其几种形式353.7特殊函数调用形式重复参数三、函数及其几种形式scala>defaddMany(msg:String,num:Int*)={

varsum=0

for(x<-num)sum+=x

println(msg+sum)

}

defaddMany:(msg:String,num:Int*)Unit

scala>addMany("sum=",1,2,3)

sum=6

scala>addMany("sum=",Array(1,2,3))

error:typemismatch;

found:Array[Int]

required:Int

scala>addMany("sum=",Array(1,2,3):_*)

sum=6举例:363.8柯里化一个函数可以有任意个参数列表。在使用时,当参数列表里只有一个参数时,在调用该函数时允许参数的圆括号改为花括号。三、函数及其几种形式scala>defadd(x:Int,y:Int,z:Int)=x+y+z

defadd:(x:Int,y:Int,z:Int)Int

scala>add(1,2,3)

valres0:Int=6

scala>defaddCurry(x:Int)(y:Int)(z:Int)=x

温馨提示

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

最新文档

评论

0/150

提交评论