Scala学习笔记-控制结构和函数(2)

来源:互联网 发布:java工程师所属部门 编辑:程序博客网 时间:2024/06/11 00:04

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


原创粉丝点击