Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Recursion 在Kotlin中有没有一种方法可以从内部调用匿名函数?_Recursion_Kotlin_Anonymous Function - Fatal编程技术网

Recursion 在Kotlin中有没有一种方法可以从内部调用匿名函数?

Recursion 在Kotlin中有没有一种方法可以从内部调用匿名函数?,recursion,kotlin,anonymous-function,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) -> Uni

我正在尝试实现一个方法,该方法将迭代回调,但是我遇到了一个问题,即我无法递归调用函数本身

该函数当前看起来如下所示:

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)
}
fun runSerial(
转让:T,
回调:列出单元(E)->单元)->单元>,
成功时:(T)->单位,
onError:(E)->单位
) {
val mutableCallbacks=callbacks.toMutableList()
val runTopCallback=fun(值:T){
if(callbacks.count()==0){
onSuccess(值)
返回
}
val nextCallback=mutableCallbacks.first()
mutableCallbacks.remove(nextCallback)
nextCallback(值、runTopCallback、onError)
}
runTopCallback(传输)
}
是否有一种方法可以重写代码,以便
runTopCallback
可以传递给
nextCallback
调用?

使用局部变量(因为Kotlin 1.2):

问题是在您尝试使用它时,
runTopCallback
既没有声明也没有定义(因为它在声明+赋值语句中)


解决方案是首先声明它-在这种情况下,最好的方法是
lateinit
,它允许一个初始值为零的变量(因此名称类似于“null initialized”变量),但在使用时不需要进行null检查。

非常感谢您,Moira。非常感谢你的帮助!:)@安迪很高兴我能帮忙:)
lateinit var runTopCallback: (T) -> Unit

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

    nextCallback(value, runTopCallback, onError)
}