在scala中定義函式,需要給出 函式名、引數、函式體。例如:
def abs (x: double) = if (x > 0) x else -x
如果有引數,必須要給出引數型別。如果函式不是遞迴的,返回值型別就可以不寫。scala編譯器自帶型別推導功能。
如果函式體由多個表示式組成,可以用**塊的方式來組織,比如:
def fac (n: int) =
在scala函式中,不推薦使用return來退出函式,雖然可以使用,但是要盡量避免。
對於遞迴函式,就必須指定返回值型別,因為這時型別推導對於編譯器來說有些困難。例如:
def fac(n: int) = if (n < 0) 1 else n * fac(n - 1)
編譯器無法推斷n * fac(n - 1)最終會是什麼型別。
在scala中,你可以為引數設定預設值。當呼叫該函式時,如果沒有為某個引數指定值,那麼函式會以設定好的預設值來執行,例如:
def sum(a: int = 1,b: int = 2, c: int = 3) =
在呼叫的時候,你可以指定自己想要的a、b和c的值,比如:
sum(10,20,30)
會得到60,也可以只給0個或1個或2個引數,當引數不夠的時候,預設引數會從後往前逐個應用進來。下面演示一下,這個機制還是很好理解的:
在scala函式中,你也可以使用帶名引數,就像下面這樣:
要注意引數名要寫的和定義時一樣,這種方式一般是用來保證引數正確的得到賦值,如果對函式的定義不了解,還不如不寫。以下幾種寫法都是正確的:
sum(10,b = 20, 30) //60
sum(10,b = 20) //33
sum(10,c = 20) //32
這樣寫也對:
sum(10,c = 20,b = 30) //60
但是最好不要這樣,會導致混亂,引數的先後順序建議按照定義的先後順序寫。
有時候,在定義的時候不能確定函式的引數個數或者為了使函式具有更好的通用性,可以定義變長引數。比如:
def sum (args: int*) =
這樣就可以使用任意多的引數了。比如這樣呼叫:
val s = sum(1, 2, 3, 4, 5) //15
引數可以看成乙個seq型別。但是你不可以直接傳給sum乙個已有的序列,比如:
val s = sum(1 to 5)
會提示乙個型別不匹配的錯誤:
可以這樣來使剛才的做法變得可行:
val s = sum(1 to 5:_*)
執行如下:
這樣用:_*來告訴編譯器把這個引數當做引數序列來處理。編譯器就會不追究了。在scala中這樣的奇怪符號還有很多,以後有機會再介紹了。
在一些場景中,這樣的語法是必須要用到的。
def resum(args int*): int =
在這個遞迴求和函式中.head表示首個元素,.tail表示除了首個元素,其餘的元素,返回的也是乙個seq型別。所以需要用:_*來轉換。
scala中的函式
1.方法定義用def,函式的引數 要寫型別,不寫型別不可以。2.函式的返回值型別可以不寫,會自動推斷 3.scala會將函式體中最後一行計算的結果當做返回值返回 4.可以寫 return 寫了return要顯式的宣告方法體的返回型別。5.定義方法時,如果不寫 那麼無論方法體中最後一行計算的結果返回是...
Scala中的高階函式
1.在變數中存放函式 1 定義函式fun1 2 將函式賦給乙個變數 注意函式名和下劃線之間有空格 3 呼叫這個函式 2.匿名函式 匿名函式沒有函式名,將函式賦給變數fun2。函式的引數是string型別,返回unit型別 3.高階函式 1 函式的引數為函式的高階函式 a 函式的第乙個引數是func函...
scala中的偏函式
case語句 組合 除了可以被編譯為匿名函式 型別是functionx,在scala裡,所有的函式字面量都是乙個物件,這個物件的型別是functionx 還可以非常方便的編譯為乙個偏函式partialfunction!注意 partialfunction同時是function1的子類 編譯器會根據呼...