有没有办法在 Kotlin 中从自身内部调用匿名函数?
Is there a way to call an anonymous function from within itself in Kotlin?
我正在尝试实现一种迭代回调的方法,但是我遇到了一个问题,我无法在其自身内递归调用函数。
函数目前看起来像这样:
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
调用?
使用 lateinit
局部变量(自 Kotlin 1.2 起):
lateinit var runTopCallback: (T) -> Unit
runTopCallback = fun(value: T) {
// ...
nextCallback(value, runTopCallback, onError)
}
问题是 runTopCallback
在您尝试使用它时既没有声明也没有定义(因为这是在声明 + 赋值语句中)。
解决方案是先声明它 - 在这种情况下最好的方法是 lateinit
,它允许一个最初没有值的变量(因此得名,类似于 "null-initialized" 变量),但没有使用时需要进行空值检查。
我正在尝试实现一种迭代回调的方法,但是我遇到了一个问题,我无法在其自身内递归调用函数。
函数目前看起来像这样:
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
调用?
使用 lateinit
局部变量(自 Kotlin 1.2 起):
lateinit var runTopCallback: (T) -> Unit
runTopCallback = fun(value: T) {
// ...
nextCallback(value, runTopCallback, onError)
}
问题是 runTopCallback
在您尝试使用它时既没有声明也没有定义(因为这是在声明 + 赋值语句中)。
解决方案是先声明它 - 在这种情况下最好的方法是 lateinit
,它允许一个最初没有值的变量(因此得名,类似于 "null-initialized" 变量),但没有使用时需要进行空值检查。