第六章 (二)高階函式.md
阿新 • • 發佈:2018-12-11
1、函式型別
Kotlin融合了面向過程的特徵,而我們知道面向過程中函式和基本資料(整數、布林等)都是一樣的地位,同樣也具有資料型別;既可定義變數,也可以當做函式的形參型別;
函式型別:有引數列表、->、返回值型別組成的;
如:
fun foo(a:int,name:String):String{}
所以該函式型別就是:(Int,String)->String
當做變數:
1、定義變數:var myFun:(Int)->Unit
2、定義函式:fun foo(a:Int){}
3、將函式賦值給變數:myFun=::foo
***注意:***訪問一個函式(資料)的引用,需要在函式名前新增兩個“::”; "函式名()"表示的呼叫函式
1.1、 函式型別的變數作為函式形參
當定義一個函式,該函式的大部分邏輯都已確定,但某個邏輯可能需要根據不同情況需要動態改變,也就是需要動態傳入這些程式碼,這時傳入不同的函式作為引數,實現不同的邏輯;
如: fun calulate(a:Int,b:Int){
var result:Int=0;
//1.計算和
//2.計算乘級
}
就可以定義一個函式型別的形參,來實現不同邏輯。寫成這樣:
fun calulate(a:Int,b:Int,sum:(Int,Int)->Int){ .......... sum(a,b) } fun sum(a:int,b:Int):Int{ return a+b } 呼叫: calulate(2,3,::sum)
這樣就隨著實際傳入的函式
1.3、函式型別的變數作為函式返回值
fun calculate(type: String): (Int) -> Int { fun square(n: Int): Int { return n * n } fun cube(n: Int): Int { return n * n * n } fun factorial(n:Int):Int{ var result=1; for (index in 2..n){ result*=index } return result } when (type) { "square" -> return ::square "cube" -> return ::cube else -> return ::factorial } } fun main(args: Array<String>) { val squar = calculate("square") println(squar(3)) }
這裡補充一點的是:在calculate()函式中定義了三個區域性變數,那麼三個區域性函式的作用域只限於這個函式內使用;但是將區域性函式賦值給變數,這三個區域性變數的作用域就和這變數的作用域一樣,如果這變數時全域性變數,那麼自然區域性函式的作用域也變成了全域性;