在 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
并查看其定义方式。
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
并查看其定义方式。