1. 程式人生 > >Kotlin的高階特性:8、Kotlin的行內函數

Kotlin的高階特性:8、Kotlin的行內函數

Kotlin 的行內函數

Kotlin 的函式可以通過一個 inline 的修飾符,將這個函式在編譯期直接內聯到原始碼中。

  • 在 Kotlin 中,內部 Lambda 是不允許中斷外部函式執行的
  • inline 的 Lambda 可以中斷外部函式呼叫
  • crossinline 不允許 inline 的 Lambda 中斷外部函式執行
  • noinline 拒絕內聯

inline 的 Lambda 中斷外部函式演示

  • 未中斷的情況
  • 中斷的情況

crossinline 不允許 inline 的 Lambda 中斷外部函式執行演示

noinline 拒絕內聯

什麼時候要使用 noinline

拒絕內聯呢?看如下函式

package zyf.kt

fun main(args: Array<String>) {
    show2 ({
        println("666")
    },{
        2
    })
}

inline fun show2(l0:()->Unit,l1:()->Int):()->Int{
    l0.invoke()
    //這裡會提示編譯錯誤
    return l1
}


上述函式 show2 接受一個 l0 返回一個 l1,剛剛圖2已經提到了,會將 lambda 平鋪在程式碼裡,但是 show2

返回的 l1 如何也平鋪在程式碼裡,那是不是返回的 l1 的返回值 2 ,就變成了 main 函式的返回值了,那麼程式碼就變的不合法了。

解決方式,在返回值的函式 l1 前,加上 noinline,使得 l1 不會平鋪在程式碼裡。