Scala学习笔记-控制结构和函数(2)
2017-10-19 17:01
645 查看
7.函数
scala除了方法外还支持函数。方法对对象进行操作,函数不是。
要定义函数,需要给出函数名、参数和函数体,例如:
def abs (x: Double) =if(x >= 0) x else -x
只要函数不是递归的,一般不需要指定返回类型。scala编译器可以通过= 符号右侧的表达式的类型推断出返回类型
如果函数体需要多个表达式完成,可以用代码块。块中最后一个表达式的值就是函数的返回值。例如:
def fac(n:Int)={
var r=1
for(i<-1 to n) r=r*i
r
}
对于递归函数,必须指定返回值类型。例如:
def fac(n:Int): Int= if(n<=0) 1 else n*fac(n-1)
如果没有返回值类型,scala编译器无法教育n*fac(n-1)的类型是Int
8. 默认参数和带名参数
在调用某些函数时并不显式地给出所有参数值,对于这些函数可以使用默认参数。例如:
def decorate(str: String, left :String = "[", right: String=" ]")= left+str+right
这里 left和right带有默认值,如果你不喜欢默认值,也可以给出自己的left 和right
9. 变长参数
例如:
def sum(args :Int*)={
var result=0;
for(arg<-args) result+=arg
result
}
可以使用任意多个参数来调用该函数,例如 val s=sum(1,4,7,9)
如果你已经有一个值的序列,则不能直接将它传染上述函数,例如: val s=sum(1 to 5) //错误
如果sum函数被调用时传入的是单个参数,那么该参数必须是单个整数,而不是一个整数区间。解决办法如下:
val s =sum( 1 to 5:_*) //将1 to 5 当做参数序列处理
10. 过程
scala对于不返回值的函数有特殊的表示法。如果函数体包含在花括号当中但没有前面的=号,那么返回类型就是Unit。这样的函数被称作过程。过程不返回值,调用它仅为了它的副作用。
11. 懒值
当val被声明为lazy时,它的初始化将被推迟,直到首次对它进行取值。例如:
lazy val words=scala.io.Source.fromFile("c:\\words").mkString
如果不访问words,那么文件不会被打开。懒值对于开销较大的初始化语句是否有用
可以把懒值当做是介于val 和def 的中间状态。例如:
12.异常
scala异常的工作机制与Java一样。当你抛出异常时,和Java一样,抛出的对象必须是Java.lang.Throwable的子类。不过,Scala没有“受检”异常---你不需要声明说函数或者方法可能抛出的某种异常。
throw表达式有特殊的类型Nothing。这在if/else表达式中很有用。如果一个分支的类型是Nothing,那么if/else表达式的类型就是另一个分支的类型。例如:
if(x>=0) { sqrt(X)} else throw new Exception("x should not be negative")
第一个分支类型是Double,第二个分值类型是Nothing,因此if/else表达式的类型就是Double
scala除了方法外还支持函数。方法对对象进行操作,函数不是。
要定义函数,需要给出函数名、参数和函数体,例如:
def abs (x: Double) =if(x >= 0) x else -x
只要函数不是递归的,一般不需要指定返回类型。scala编译器可以通过= 符号右侧的表达式的类型推断出返回类型
如果函数体需要多个表达式完成,可以用代码块。块中最后一个表达式的值就是函数的返回值。例如:
def fac(n:Int)={
var r=1
for(i<-1 to n) r=r*i
r
}
对于递归函数,必须指定返回值类型。例如:
def fac(n:Int): Int= if(n<=0) 1 else n*fac(n-1)
如果没有返回值类型,scala编译器无法教育n*fac(n-1)的类型是Int
8. 默认参数和带名参数
在调用某些函数时并不显式地给出所有参数值,对于这些函数可以使用默认参数。例如:
def decorate(str: String, left :String = "[", right: String=" ]")= left+str+right
这里 left和right带有默认值,如果你不喜欢默认值,也可以给出自己的left 和right
9. 变长参数
例如:
def sum(args :Int*)={
var result=0;
for(arg<-args) result+=arg
result
}
可以使用任意多个参数来调用该函数,例如 val s=sum(1,4,7,9)
如果你已经有一个值的序列,则不能直接将它传染上述函数,例如: val s=sum(1 to 5) //错误
如果sum函数被调用时传入的是单个参数,那么该参数必须是单个整数,而不是一个整数区间。解决办法如下:
val s =sum( 1 to 5:_*) //将1 to 5 当做参数序列处理
10. 过程
scala对于不返回值的函数有特殊的表示法。如果函数体包含在花括号当中但没有前面的=号,那么返回类型就是Unit。这样的函数被称作过程。过程不返回值,调用它仅为了它的副作用。
11. 懒值
当val被声明为lazy时,它的初始化将被推迟,直到首次对它进行取值。例如:
lazy val words=scala.io.Source.fromFile("c:\\words").mkString
如果不访问words,那么文件不会被打开。懒值对于开销较大的初始化语句是否有用
可以把懒值当做是介于val 和def 的中间状态。例如:
12.异常
scala异常的工作机制与Java一样。当你抛出异常时,和Java一样,抛出的对象必须是Java.lang.Throwable的子类。不过,Scala没有“受检”异常---你不需要声明说函数或者方法可能抛出的某种异常。
throw表达式有特殊的类型Nothing。这在if/else表达式中很有用。如果一个分支的类型是Nothing,那么if/else表达式的类型就是另一个分支的类型。例如:
if(x>=0) { sqrt(X)} else throw new Exception("x should not be negative")
第一个分支类型是Double,第二个分值类型是Nothing,因此if/else表达式的类型就是Double
相关文章推荐
- Scala学习笔记2 - 控制结构和函数
- Scala学习笔记-控制结构和函数(1)
- js面向对象学习笔记之七(函数 与 基础控制结构)
- Scala学习笔记——内建控制结构
- Scala学习教程笔记一之基础语法,条件控制,循环控制,函数,数组,集合
- linux shell编程控制结构:expr、let、for、while、until、shift、if、case、break、continue、函数、select 学习笔记
- linux shell编程控制结构:expr、let、for、while、until、shift、if、case、break、continue、函数、select 学习笔记
- linux shell编程控制结构:expr、let、for、while、until、shift、if、case、break、continue、函数、select 学习笔记
- scala学习之路(二)控制结构和函数
- Scala学习(二)--- 控制结构和函数
- 快学Scala第2章–控制结构和函数 笔记
- Scala学习笔记05【Scala函数定义、流程控制、异常入门】
- Oracle PLSQL 学习笔记(块、控制结构、过程、函数、包)
- Scala2.11.7学习笔记(三)控制结构及异常处理
- Go语言学习笔记(三) [控制结构、内建函数]
- Oracle PLSQL 学习笔记(块、控制结构、过程、函数、包)
- Scala学习(二)--- 控制结构和函数
- Scala学习笔记-控制结构
- Scala学习教程笔记一之基础语法,条件控制,循环控制,函数,数组,集合
- scala学习第二章 控制结构与函数