我正试图在Kotlin中创建一个类型安全的groovy式构建器,就像它描述的那样here。 问题是嵌套lambda中lambda接收器的可见性。 这是一个简单的例子。
html {
head(id = "head1")
body() {
head(id = "head2")
}
}
嵌套lambda的接收者是没有'head'方法的Body。然而,这段代码编译并打印到:
<html>
<head id="head1"></head>
<head id="head2"></head>
<body></body>
</html>
预计但是有没有办法在内部头部出现编译错误?
答案 0 :(得分:4)
至于Kotlin 1.0,这是不可能的。此功能有open feature request。
答案 1 :(得分:1)
这是可能的,因为Kotlin 1.1,感谢introduction of the @DslMarker
annotation。
以下是如何使用它的示例:
@DslMarker
annotation class MyHtmlDsl
@MyHtmlDsl
class HeadBuilder
@MyHtmlDsl
class BodyBuilder
@MyHtmlDsl
class HtmlBuilder {
fun head(setup: HeadBuilder.() -> Unit) {}
fun body(setup: BodyBuilder.() -> Unit) {}
}
fun html(setup: HtmlBuilder.() -> Unit) {}
fun main(args: Array<String>) {
html {
head {}
body {
head { } // fun head(...) can't be called in this context by implicit receiver
}
}
}
另见上文链接的公告文件。