首页 > 解决方案 > 我们如何在没有 Kotlin 协程中的任何实例的情况下使用 emit() 和 delay() 函数?

问题描述

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) } 
}

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

标签: androidandroid-studiokotlinkotlin-coroutinescoroutine

解决方案


这里有两个不同的东西。

流通情况的emit()内侧

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

delay()案例_

这要简单得多。Kotlin 支持全局函数。与类没有真正关联的函数(在内部,Kotlin 编译器将创建一个类并将这些函数作为静态方法放在那里)。你可以Ctrl-Clickdelay看看是怎么定义的。


推荐阅读