¿Cómo extraigo partes de código en variables locales en Kotlin cuando uso el generador HTML de Ktor?

Estoy tratando de entender el creador de HTML en Kotlin / Ktor. El ejemplo aquí usa el generador de HTML para generar el resultado:

call.respondHtml { head { title { +"HTML Application" } } body { h1 { +"Sample application with HTML builders" } widget { +"Widgets are just functions" } } } 

Estoy tratando de extraer el cuerpo en una variable como esta:

 val block: HTML.() -> Unit = { head { title { +"HTML Application" } } body { h1 { +"Sample application with HTML builders" } } } call.respondHtml(block) 

Ahora obtengo el siguiente error de compilation:

 Error:(37, 22) Kotlin: None of the following functions can be called with the arguments supplied: public suspend fun ApplicationCall.respondHtml(status: HttpStatusCode = ..., versions: List<Version> = ..., cacheControl: CacheControl? = ..., block: HTML.() -> Unit): Unit defined in org.jetbrains.ktor.html public suspend fun ApplicationCall.respondHtml(status: HttpStatusCode = ..., block: HTML.() -> Unit): Unit defined in org.jetbrains.ktor.html 

Cuando agrego el primer argumento (opcional) funciona de nuevo: call.respondHtml(HttpStatusCode.OK, block) .

¿Por qué no funciona, cuando simplemente trato de extraer el cuerpo en una variable?

Creo que al comstackdor no le gusta tener un parámetro obligatorio después de los pnetworkingeterminados, a less que sea un lambda fuera de los corchetes.

Intenta nombrarlo

 call.respondHtml(block = block) 

Por cierto, si lo que quieres es extraer la lógica, te recomendaría usar funciones. Para tu ejemplo:

 fun HTML.headAndBody() { head { title { +"HTML Application" } } body { h1 { +"Sample application with HTML builders" } widget { +"Widgets are just functions" } } } call.respondHtml { headAndBody() } 

De esta forma, incluso puede agregar parameters a su bloque de html, creando un componente personalizado a partir de él.

  • Cómo inyectar dependencies en una aplicación ktor