kotlin - 挂起函数引用作为 let 的参数会出错
问题描述
为什么 Kotlin 不能引用挂起函数作为 let/also 等函数的参数?
class X
fun a(x: X) {}
suspend fun b(x: X) {}
X().let(::a)
X().let(::b) // Error: Type mismatch
解决方案
您只能suspend
从协程或另一个挂起函数中调用函数。并且let
不以挂起函数作为参数。
public inline fun <T, R> T.let(block: (T) -> R): R
因此,与任何其他类型一样,函数声明必须匹配。将挂起函数传递给另一个不接受挂起函数的函数将不起作用。
当您具有以下功能时,它将起作用:
这只是一个示例,用于打印日志的挂起功能没有真正的用例!
suspend inline fun log(block: suspend () -> String) {
val message: String = block() // we assume block takes some time to be computed
return println(message) // once its available, we print it
}
您可以使用如下log
功能:
suspend fun complexError(): String {
// takes time to compute...
return "message"
}
// usage
suspend fun errorHandling() {
log(::complexError) // pass a reference to complexError()
// or
log() { complexError() }
}
推荐阅读
- c# - c# sql server更新表连接超时
- javascript - 如何自定义 Chart.js 折线图的工具提示?
- ansible - 显示 NONE 作为缺少 ansible_facts 的值
- python - 如何将 python 连接到 MySQL 服务器
- java - 为什么通过 PUT/PATCH 路由关联后,我无法同时获得两个 Spring“多对多”实体的信息?
- r - R,ifelse 错误:一元运算符的参数无效
- php - 如何覆盖/更新选定的文件 / PHP
- c# - asp.net core razor pages - 策略授权 - 控制组织对文件夹页面的访问
- javascript - 如何使用 PEG.js 创建一个简单的解析器
- angular - Observable 受变量控制