首页 > 解决方案 > 挂起函数引用作为 let 的参数会出错

问题描述

为什么 Kotlin 不能引用挂起函数作为 let/also 等函数的参数?

class X

fun a(x: X) {}
suspend fun b(x: X) {}

X().let(::a)
X().let(::b) // Error: Type mismatch

标签: kotlinsuspendkotlin-coroutines

解决方案


您只能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() }
}

推荐阅读