挂起函数引用作为 let 的参数获取错误
Suspend function reference as parameter of let gets error
为什么Kotlin不能引用suspend函数作为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() }
}
为什么Kotlin不能引用suspend函数作为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() }
}