gpt4 book ai didi

lambda - kotlin html builder 如何在幕后工作?

转载 作者:行者123 更新时间:2023-12-02 13:39:03 24 4
gpt4 key购买 nike

这是一个片段,解释了 htmlx builder 的某些部分(来自文档):

protected fun <T : Element> initTag(tag: T, init: T.() -> Unit): T {
tag.init()
children.add(tag)
return tag
}

重点是 children.add(tag) ,所以我们可以声明:
html {
head {}
body {}
}

因为 head 和 body 是 html 的成员函数。
但是 呢?分区 标签 ?我可以在任何地方声明 div,此外我可以写这样的东西:
someEnclosingTag { (1..3).forEach { div {+"MyCustomDivFromEverywhere"}  }}

封闭 lambda 如何知道可以在任何地方声明的“子”lambda(以及分别将“子”标签添加到整个 html)?

请纠正我,如果我在某个地方错了。

更新

根据答案,我以下面的脏虚拟代码结束,它显示了函数范围(闭包的某些方面)和隐式接收器遗漏(希望它可以以某种方式帮助某人):
fun main(args: Array<String>) {
Child().childFun {
/*childFun lambda receiver implements parent1Fun lambda receiver, so the receiver can be omitted*/
parent1Fun {
/*call from Child.() -> Unit receiver*/
someIntrestingFun()
}
/*same as with parent1Fun*/
parent2Fun {
/*call from Child.() -> Unit receiver*/
someIntrestingFun()
}
}
}

fun Child.childFun(lambda: Child.() -> Unit): Child = genericFun(Child(), lambda)

fun ParentInt1.parent1Fun(lambda: ParentInt1.() -> Unit): ParentInt1 = genericFun(Child(), lambda)

fun ParentInt2.parent2Fun(lambda: ParentInt2.() -> Unit): ParentInt2 = genericFun(Child(), lambda)

fun <T> genericFun(instance:T, lambda:T.() -> Unit): T {
instance.lambda()
return instance
}

interface ParentInt1
interface ParentInt2

class Child : ParentInt1, ParentInt2 {
fun someIntrestingFun() { println(this) }
}

最佳答案

您可以在语言引用中找到有关构建此类 DSL 的技术的更多信息,请参阅:Type-Safe Builders ,并且该页面提供了一个示例 HTML 构建器(尽管 kotlinx.html 更复杂)。

How does enclosing lambda knows about "child" lambdas that can be declared everywhere?



这就是函数解析的工作原理:当你有嵌套的 lambdas 时,不管有没有接收器,在内部的你可以在外部的接收器上调用成员/扩展函数(*),这是一个非常综合的例子:
with(arrayListOf<String>()) {
with(hashMapOf<Int, String>()) {
// You can call both functions of `ArrayList` and `HashMap`:
add("foo")
put(1, "bar")

// Even in the nested lambdas with no receiver:
baz.forEach { put(it, "it = $it") }
}
}

(*):在高级 DSL 中,可以使用 @DslMarker 限制范围,以避免从外部范围意外调用接收器上的函数。

关于lambda - kotlin html builder 如何在幕后工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47348561/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com