如何在Kotlin中编写正确的HTML生成器

我正在学习Kotlin并阅读“ 类型安全建设者 ”部分

我跟着它的例子,编写了一些测试,然后我发现了一个我无法理解的问题。 问题是,看起来下面的代码是等价的:

  1. 嵌套的head

     html { head { title { +"First Title" } head { title { +"Second Title" } } } } 
  2. 两个head在同一水平

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

这两个函数调用返回相同的结果。 测试结果

我认为正确的结果应该是“你看到的就是你得到的”。

如果仔细查看“com.example.html包的完整定义”,您将看到headHTML一种方法。 这意味着head只能在HTML一个实例上被调用。 你期待它的工作方式,必须有一个head班的Head

在你的第一个示例代码中, head的第二个调用实际上是在外部html实例接收器上调用的。 这意味着你有效的添加它创建的新元素到html不是它的立即封闭的head

换句话说,你的第一个代码示例等同于:

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

注意this@html ,它正在限定哪个外部的接收者实例被用来调用head 。 还要注意, this@head不会编译,因为正如我所说的, Head类没有head方法。