Scala除了支持方法,还支持函数。方法对对象操作,函数不是。
定义函数
scala> def abs(x:Double)=if(x>=0) x else -x
abs: (x: Double)Double
如果函数体需要多个表达式完成,则可以使用代码块,其中最后一个表达式就是函数的返回值
scala> def fac(n:Int)={
| var r=1
| for(i<-1 to n)r=r*i
| r
| }
fac: (n: Int)Int
对于递归函数,必须指定返回类型
scala> def fac(n:Int):Int=if(n<=0)1 else n*fac(n-1)
fac: (n: Int)Int
参数
默认参数
scala> def decorate(str:String,left:String="[",right:String="]")=left+str+right
decorate: (str: String, left: String, right: String)String
可以在提供参数值时指定参数名
decorate(left="<<<",str="Hello",right=">>>")
可变长参数
scala> def sum(args:Int*)={
| var result=0
| for(arg<-args) result+=arg
| result
| }
sum: (args: Int*)Int
val s=sum(1,4,9,16,25)
但是下面的方式是不对的
val s=sum(1 to 5)
应该讲上面区间当做参数序列处理
val s=sum(1 to 5:_*)
实际上,在递归中很可能用到类似处理
def recursiveSum(args:Int*):Int={
if(args.length==0) 0
else args.head+recursiveSum(args.tail:_*)
}
过程
Scala对于不返回值的函数有特殊的表示方法,这就是过程(procedure)。
过程不返回值,调用它们仅仅是为了他的副作用。
scala> def box(s:String){
| var border="-"*s.length+"--\n"
| println(border+"|"+s+"|\n"+border)
| }
box: (s: String)Unit
scala> box("YangYue")
---------
|YangYue|
---------