Kotlin行內函式


行內函式使用關鍵字內聯宣告,行內函式的使用增強了高階函式的效能。 行內函式告訴編譯器將引數和函式複製到呼叫站點。

虛擬函式或區域性函式不能宣告為內聯。 以下是行內函式內部不支援的一些表示式和宣告:

  • 區域性類宣告
  • 內部巢狀類的宣告
  • 函式表示式
  • 宣告區域性函式
    區域性可選引數的預設值

讓我們看一下行內函式的基本範例:

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("行內函式內的程式碼")
}

執行上面範例程式碼,得到以下結果 -

呼叫行內函式

crossline註解

要防止從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")
}

noinline修飾符

在行內函式中,當想要將行內函式中傳遞的一些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型別引數,則編譯器將生成警告。