是否有可能隐藏lambda闭包的变量?

时间:2016-09-12 18:39:26

标签: lambda kotlin type-safety builder-pattern

我正试图在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>

预计但是有没有办法在内部头部出现编译错误?

2 个答案:

答案 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
        }
    }
}

另见上文链接的公告文件。