Cómo escribir el generador HTML correcto en Kotlin

Estoy aprendiendo Kotlin y leyendo la sección Constructores de tipo seguro

Seguí su ejemplo y codifiqué algunas testings y luego encontré un problema que no podía entender. El problema es que parece que el siguiente código es equivalente:

  1. head anidada

     html { head { title { +"First Title" } head { title { +"Second Title" } } } } 
  2. Dos head en el mismo nivel

     html { head { title { +"Second Title" } } head { title { +"First Title" } } } 

Estas dos llamadas de function devuelven el mismo resultado. Resultado de la testing

Creo que el resultado correcto debería ser "Lo que ves es lo que obtienes".

Si observa detenidamente la "definición completa del package com.example.html", verá que ese head es un método de HTML . Esto significa que solo se puede invocar head en una instancia de HTML . De la forma en que espera que funcione, tendría que haber un miembro principal de la class Head .

En su primer código de ejemplo, la segunda invocación de la head se está llamando realmente al receptor externo de la instancia html . Esto significa que eres efectivo agregando el nuevo elemento que crea a html y no su head encierra inmediatamente.

Para decirlo de otra manera, su primer ejemplo de código es equivalente a esto:

 html { head { title { +"First Title" } this@html.head { title { +"Second Title" } } } } 

Tenga en count que this@html califica exactamente qué instancia de receptor externo se está utilizando para invocar el head . También tenga en count que this@head no se comstackrá porque, como ya he dicho, la class Head no tiene un método principal.