gpt4 book ai didi

kotlin - 嵌套闭包中使用了错误的 "this"

转载 作者:IT老高 更新时间:2023-10-28 13:45:27 25 4
gpt4 key购买 nike

我试图保持最小化,但如果我太最小化,请告诉我。

假设你有一个像这样的类层次结构,设计用于生成 HTML(受 Kotlin 教程的启发;半伪代码如下):

class Tag {
protected val children = arrayListOf<Tag>()
operator fun String.unaryPlus() = children.add(Text(this))
}
class TagWithChildren : Tag() {
fun head(init: Head.() -> Unit) = initializeTag(Head(), init)
fun script(init: Script.() -> Unit) = initializeTag(Script(), init)
fun <T : Tag> initializeTag(tag: T, init: T.() -> Unit): T {
tag.init()
children.add(tag)
return tag
}
}
class Head : TagWithChildren()
class Script : Tag()
class Text(val str: Text) : Tag()

注意 Headheadscript 方法,而 Script 没有。

现在您可以构建一个如下所示的模板:

head {
script {
+"alert('hi');"
}
}

效果很好!但是,如果传递给 script 的 block 尝试调用 Script 上不可用的方法,它可以改为调用 Head 上的方法。例如,

head {
script {
script {
+"alert('hi');"
}
}
}

不仅不是编译错误,它实际上等同于

head {
script {
}
script {
+"alert('hi');"
}
}

从模板作者的角度来看,这 super 困惑

有什么方法可以防止方法查找像那样向上传播吗?我希望它查看最里面的范围。


2016 年 11 月 24 日更新:Kotlin 1.1-M03 引入了范围控制,我相信它可以解决这个问题。 https://blog.jetbrains.com/kotlin/2016/11/kotlin-1-1-m03-is-here/

最佳答案

当前行为是故意的。 lambda 中的代码可以访问所有封闭范围的接收器。 future 版本的 Kotlin 可能会添加一个修饰符,将带有接收器的 lambda 限制为仅调用该接收器上的方法,而不是封闭范围,但在当前版本中,无法更改该行为。

关于kotlin - 嵌套闭包中使用了错误的 "this",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34834739/

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