在 Kotlin Coroutine 中,我们如何在没有任何实例的情况下使用 emit() 和 delay() 函数?

how are we able to use emit() and delay() functions without any instance in Kotlin Coroutine?

fun simple(): Flow<Int> = flow { 
    println("Flow started")
    for (i in 1..3) {
        delay(100)
        emit(i)
    }
}

fun main() = runBlocking<Unit> {
    println("Calling simple 
   functionn...")
    val flow = simple()
    println("Calling collect...")
    flow.collect { value -> 
   println(value) } 
    println("Calling collect 
   again...")
    flow.collect { value -> 
    println(value) } 
}

要调用 class 中的函数,我们使用 class 的对象和 。运算符,但在 Kotlin Coroutine 中,我们如何在不使用任何对象的情况下使用 emit() 和 delay() 函数(如上面的代码所示)?

这里有两个不同的东西。

emit()一个流程案例

有一个为该范围定义的接收器。在 Kotlin 中,函数类型(如 (Int) -> Int)也可以采用“接收器”,如:SomeObject.(Int) -> Int。这意味着当调用该 lambda 时,将传递一个 SomeObject 实例并将充当默认情况下将“接受”调用的隐式“this”。您可以在此处阅读更多相关信息:https://kotlinlang.org/docs/lambdas.html#function-types

delay()案例

这个就简单多了。 Kotlin 支持全局函数。与 class 没有真正关联的函数(在内部,Kotlin 编译器将创建一个 class 并将这些函数作为静态方法放在那里)。您可以按住 Ctrl 键并单击 delay 并查看其定义方式。