有没有办法在Kotlin内部调用匿名函数?

时间:2018-06-14 15:59:21

标签: recursion kotlin anonymous-function

我正在尝试实现一个迭代回调的方法,但是我遇到了一个问题,我无法以递归方式调用自身内的函数。

该功能目前如下所示:

fun <T : Any?, E : Any?> runSerial(
    transfer: T,
    callbacks: List<(T, (T) -> Unit, (E) -> Unit) -> Unit>,
    onSuccess: (T) -> Unit,
    onError: (E) -> Unit
) {
    val mutableCallbacks = callbacks.toMutableList()
    val runTopCallback = fun(value: T) {
        if (callbacks.count() == 0) {
            onSuccess(value)

            return
        }

        val nextCallback = mutableCallbacks.first()
        mutableCallbacks.remove(nextCallback)

        nextCallback(value, runTopCallback, onError)
    }

    runTopCallback(transfer)
}

有没有办法改写代码,以便runTopCallback可以传递给nextCallback来电?

1 个答案:

答案 0 :(得分:4)

使用lateinit局部变量(自Kotlin 1.2起):

lateinit var runTopCallback: (T) -> Unit

runTopCallback = fun(value: T) {
    // ...

    nextCallback(value, runTopCallback, onError)
}

问题是当你尝试使用它时,runTopCallback既未声明也未定义(因为这是在声明+赋值语句中)。

解决方案是首先声明它 - 在这种情况下最好的方法是lateinit,它允许一个最初没有值的变量(因此名称,类似于&#34; null-initialized&#34;变量) ,但在使用时不需要空检查。