2017-08-05 2 views
3

J'essaie de comprendre le constructeur HTML dans Kotlin/Ktor. Le example here utilise le constructeur HTML pour construire le résultat:Comment extraire des parties de code dans des variables locales dans Kotlin en utilisant le constructeur HTML de Ktor?

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

Je suis en train d'extraire le corps dans une variable comme ceci:

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

Maintenant, j'obtiens l'erreur de compilation suivante:

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 

Lorsque j'ajoute le premier argument (optionnel), cela fonctionne de nouveau: call.respondHtml(HttpStatusCode.OK, block).

Pourquoi ça ne marche pas, quand j'essaie simplement d'extraire le corps dans une variable?

Répondre

3

Je pense que le compilateur n'aime pas avoir un obligatoire après les paramètres par défaut, sauf s'il s'agit d'un lambda en dehors des accolades.

Essayez de nommer:

call.respondHtml(block = block) 
+0

L'utilisation de paramètres nommés ne le corrige pas, mais l'explication est logique. – peq

2

BTW, si ce que vous voulez est d'extraire la logique, je recommande d'utiliser les fonctions. Pour votre exemple:

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

call.respondHtml { 
    headAndBody() 
} 

De cette façon, vous pouvez même ajouter des paramètres à votre bloc de HTML, la création d'un composant personnalisé hors de celui-ci.