理解Kotlin序列的产率

6ojccjat  于 2022-11-30  发布在  Kotlin
关注(0)|答案(1)|浏览(159)

我知道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()
        }
    }
vc9ivgsu

vc9ivgsu1#

只要查看您链接的源代码页:
调用next()首先检查hasNext()是否已经被调用过。如果已经被调用过,它可以立即返回下一个值,该值在hasNext()中排队。如果hasNext()还没有被调用,则调用nextNotReady(),它基本上调用hasNext()来准备下一个值,然后返回它。
所以真正的工作都发生在hasNext()中。(如果yieldAll()被调用,则存在)具有另一个值,在这种情况下,它可以将其排队而不恢复延续。但如果当前迭代器已完成或不存在迭代器,则它在延续上调用resume。这使得它一直运行到下一个yield()yieldAll()调用。
这个描述是一个很大的简化。它根据next/hasNext调用的顺序处理不同的边缘情况。

相关问题