1. 程式人生 > >Scala學習筆記-控制結構和函式(2)

Scala學習筆記-控制結構和函式(2)

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