我知道Kotlinsequence
只是一个带有yield
suspend函数的协程(如果我错了请纠正我),所以yield函数设置值并挂起协程,直到请求下一个值。yield
源代码
override suspend fun yield(value: T) {
nextValue = value
state = State_Ready
return suspendCoroutineUninterceptedOrReturn { c ->
nextStep = c
COROUTINE_SUSPENDED
}
}
链接到Kotlin源代码github
我看到它设置了nextValue
& state
,并通过调用suspendCoroutineUninterceptedOrReturn
挂起了协程。
现在我想知道,这是哪里得到简历?
在next()
函数中看不到任何恢复调用
override fun next(): T {
when (state) {
State_NotReady, State_ManyNotReady -> return nextNotReady()
State_ManyReady -> {
state = State_ManyNotReady
return nextIterator!!.next()
}
State_Ready -> {
state = State_NotReady
@Suppress("UNCHECKED_CAST")
val result = nextValue as T
nextValue = null
return result
}
else -> throw exceptionalState()
}
}
1条答案
按热度按时间vc9ivgsu1#
只要查看您链接的源代码页:
调用
next()
首先检查hasNext()
是否已经被调用过。如果已经被调用过,它可以立即返回下一个值,该值在hasNext()
中排队。如果hasNext()
还没有被调用,则调用nextNotReady()
,它基本上调用hasNext()
来准备下一个值,然后返回它。所以真正的工作都发生在
hasNext()
中。(如果yieldAll()
被调用,则存在)具有另一个值,在这种情况下,它可以将其排队而不恢复延续。但如果当前迭代器已完成或不存在迭代器,则它在延续上调用resume
。这使得它一直运行到下一个yield()
或yieldAll()
调用。这个描述是一个很大的简化。它根据next/hasNext调用的顺序处理不同的边缘情况。