Estoy usando Ktor para hacer solicitudes de websocket.
El método "websocket(...)" que utilizo toma dos expresiones lambda.
Entonces, como solo puedo llamar a uno con corchetes, tengo que dar el otro a través de una variable. Así que probé esto:
val request: HttpRequestBuilder.() -> Unit val socket = ktorHttpClient.webSocket(request = request) { }Los tipos de datos encajan ahora pero, por supuesto, todavía dice "La 'solicitud' de variable debe inicializarse", así que traté de inicializarla:
val request: HttpRequestBuilder.() -> Unit = HttpRequestBuilder.()Ahora el error desapareció, pero dentro de los últimos corchetes dice "Esperando una expresión", ¿qué me estoy perdiendo aquí?
PD: Tal vez incluso haya alguien que pueda explicar en detalle cómo funciona la inicialización cuando se usa ".()".
Como tu mismo dijiste, necesitas pasar dos lambdas. Puedes hacerlo directamente:
ktorHttpClient.webSocket({ /* request lambda */ }) { /* block lambda */ }O dividirlo como lo hizo:
val request: HttpRequestBuilder.() -> Unit = { /* request lambda */ } val socket = ktorHttpClient.webSocket(request) { /* block lambda */ }Puede encontrar más información sobre cómo inicializar lambdas/tipos de función aquí: https://kotlinlang.org/docs/lambdas.html#instantiating-a-function-type
Simplemente use parámetros con nombre con lambdas:
ktorHttpClient.webSocket(request = {}, block = {})