高阶函数可以将函数作为参数和/或将它们作为结果返回。
给定高阶函数:
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)
}
但还是没用。
你就快到了。现在
getFromServer()
有 CoroutineScope
作为其接收者,将其作为函数引用调用如下所示: CoroutineScope::getFromServer
所以这会起作用:
CoroutineScope(Dispatchers.IO).launch(block = CoroutineScope::getFromServer)
如果您愿意,您仍然可以返回
String
而不是 Unit
,返回值将被忽略。