协程高阶函数故障?

问题描述 投票:0回答:1

高阶函数可以将函数作为参数和/或将它们作为结果返回。

给定高阶函数:

fun highOrder(func:()->Unit ){
    println("this is a higher order function")
    func()
}

有两种使用方法:

fun main() {
    highOrder( ::doSomething )
    highOrder { doSomething() }
}

鉴于:

suspend fun getFromServer(): String {
    println("Working Hard!")
    delay(4_000)
    return "Server Response"
}

为什么我无法以同样的方式执行协程?

这是可能的:

CoroutineScope(Dispatchers.IO).launch (block = { getFromServer() })

这不是:

CoroutineScope(Dispatchers.IO).launch (block = ::getFromServer )

错误消息:“推断类型为 KSuspendFunction0,但暂停 CoroutineScope。() -> 预期为单位”

虽然我知道这不是启动协程的推荐方法,但我很好奇为什么后一种实现不起作用。我怎样才能让它发挥作用?

正在寻找

block
参数

suspend CoroutineScope.() -> Unit

是否可以定义一个遵守该规则的函数?

我已将函数进行条带化并将其重命名为:

suspend fun CoroutineScope.getFromServer() {
    println("Working Hard!")
    delay(4_000) 
}

但还是没用。

kotlin kotlin-coroutines higher-order-functions
1个回答
0
投票

你就快到了。现在

getFromServer()
CoroutineScope
作为其接收者,将其作为函数引用调用如下所示:
CoroutineScope::getFromServer

所以这会起作用:

CoroutineScope(Dispatchers.IO).launch(block = CoroutineScope::getFromServer)

如果您愿意,您仍然可以返回

String
而不是
Unit
,返回值将被忽略。

© www.soinside.com 2019 - 2024. All rights reserved.