行內函式使用關鍵字內聯宣告,行內函式的使用增強了高階函式的效能。 行內函式告訴編譯器將引數和函式複製到呼叫站點。
虛擬函式或區域性函式不能宣告為內聯。 以下是行內函式內部不支援的一些表示式和宣告:
讓我們看一下行內函式的基本範例:
fun main(args: Array<String>) {
inlineFunction({ println("呼叫行內函式")})
}
inline fun inlineFunction(myFun: () -> Unit ) {
myFun()
print("行內函式內的程式碼")
}
執行上面範例程式碼,得到以下結果 -
呼叫行內函式
行內函式內的程式碼
從行內函式,可以從lambda
表示式本身返回。 這也將導致退出呼叫行內函式。 在這種情況下,允許函式文字具有非區域性返回語句。
fun main(args: Array<String>) {
inlineFunction({ println("呼叫行內函式")
return},{ println("行內函式中的下一個引數")})
}
inline fun inlineFunction(myFun: () -> Unit, nxtFun: () -> Unit) {
myFun()
nxtFun()
print("行內函式內的程式碼")
}
執行上面範例程式碼,得到以下結果 -
呼叫行內函式
要防止從lambda表示式和行內函式本身返回,可以將lambda
表示式標記為crossinline
。 如果在lambda表示式中找到了return
語句,則會丟擲編譯器錯誤。
fun main(args: Array<String>) {
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<String>) {
inlineFunctionExample({ println("呼叫行內函式")},
{ println("行內函式中的下一個引數")} )
println("這是關閉main函式")
}
inline fun inlineFunctionExample(myFun: () -> Unit, noinline nxtFun: () -> Unit ) {
myFun()
nxtFun()
println("行內函式內的程式碼")
}
執行上面範例程式碼,得到以下結果 -
呼叫行內函式
行內函式中的下一個引數
行內函式內的程式碼
這是關閉main函式
如果行內函式不包含noinline
函式引數且沒有reified
型別引數,則編譯器將生成警告。