1. 程式人生 > >第六章 (二)高階函式.md

第六章 (二)高階函式.md

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()函式中定義了三個區域性變數,那麼三個區域性函式的作用域只限於這個函式內使用;但是將區域性函式賦值給變數,這三個區域性變數的作用域就和這變數的作用域一樣,如果這變數時全域性變數,那麼自然區域性函式的作用域也變成了全域性;