📅  最后修改于: 2021-01-05 07:27:32             🧑  作者: Mango
内联函数用关键字inline声明。内联函数的使用增强了高阶函数的性能。内联函数告诉编译器将参数和函数复制到调用站点。
虚函数或局部函数不能声明为inline 。以下是内联函数内部不支持的一些表达式和声明:
让我们看一下内联函数的基本示例:
fun main(args: Array) {
inlineFunction({ println("calling inline functions")})
}
inline fun inlineFunction(myFun: () -> Unit ) {
myFun()
print("code inside inline function")
}
输出:
calling inline functions
code inside inline function
从内联函数,我们可以从lambda表达式本身返回。这也将导致在其中内联函数被调用的函数退出。在这种情况下,函数字面量可以包含非本地return语句。
fun main(args: Array) {
inlineFunction({ println("calling inline functions")
return},{ println("next parameter in inline functions")})
}
inline fun inlineFunction(myFun: () -> Unit, nxtFun: () -> Unit) {
myFun()
nxtFun()
print("code inside inline function")
}
输出:
calling inline functions
为了防止从lambda表达式和内联函数本身返回,我们可以将lambda表达式标记为crossinline 。如果在该lambda表达式中找到了return语句,则将引发编译器错误。
fun main(args: Array) {
inlineFunction({ println("calling inline functions")
return // compile time error
},{ println("next parameter in inline functions")})
}
inline fun inlineFunction(crossline myFun: () -> Unit, nxtFun: () -> Unit) {
myFun()
nxtFun()
print("code inside inline function")
}
在内联函数,当我们希望将内联函数传递的某些lambda作为内联时,请使用noinline修饰符标记其他函数参数。这用于设置在调用中不内联的表达式。
fun main(args: Array) {
inlineFunctionExample({ println("calling inline functions")},
{ println("next parameter in inline functions")} )
println("this is main function closing")
}
inline fun inlineFunctionExample(myFun: () -> Unit, noinline nxtFun: () -> Unit ) {
myFun()
nxtFun()
println("code inside inline function")
}
输出:
calling inline functions
next parameter in inline functions
code inside inline function
this is main function closing
如果一个内联函数不包含任何noinline函数参数,并且不包含任何类型化的参数,则编译器将生成警告。