在 Kotlin 中使用“.()”表达式初始化变量

Initialize variables with ".()" expression in Kotlin

我正在使用 Ktor 发出 websocket 请求。
我使用的方法“websocket(...)”采用两个 lambda 表达式。

因为我只能用大括号调用一个,所以我必须通过变量给另一个。所以我尝试了这个:

val request: HttpRequestBuilder.() -> Unit
val socket = ktorHttpClient.webSocket(request = request) {

}

数据类型现在适合,但当然它仍然说“变量 'request' 必须初始化”,所以我尝试初始化它:

val request: HttpRequestBuilder.() -> Unit = HttpRequestBuilder.()

现在错误消失了,但在最后一个括号内显示“Expecting an expression”,我在这里遗漏了什么?

PS: 也许甚至有人可以详细解释使用“.()”时初始化是如何工作的。

正如您自己所说,您需要传递两个 lambda。您可以直接这样做:

ktorHttpClient.webSocket({ /* request lambda */ }) {
    /* block lambda */
}

或者像你一样拆分:

val request: HttpRequestBuilder.() -> Unit = { /* request lambda */ } 
val socket = ktorHttpClient.webSocket(request) {
    /* block lambda */
}

有关如何初始化 lambda 表达式/函数类型的更多信息,请参见此处:https://kotlinlang.org/docs/lambdas.html#instantiating-a-function-type

只需将命名参数与 lambda 一起使用:

ktorHttpClient.webSocket(request = {}, block = {})