在 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 = {})
我正在使用 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 = {})