版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Leslie_LN/article/details/82805084
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()函数中定义了三个局部变量,那么三个局部函数的作用域只限于这个函数内使用;但是将局部函数赋值给变量,这三个局部变量的作用域就和这变量的作用域一样,如果这变量时全局变量,那么自然局部函数的作用域也变成了全局;