Kotlin 类型安全构建器的接收器解析与作用域控制
利用 @DslMarker 和多个接收器构建无歧义的 DSL,解决嵌套 lambda 的作用域冲突。 · 难度:入门 · +10XP
类型安全构建器的接收器解析与作用域控制
Kotlin 的 DSL 构建器通过 lambda 接收器(receiver)实现上下文传递,但当多层嵌套时,外层成员被隐式访问容易引发歧义。本教程将介绍 @DslMarker 注解如何标记作用域边界,禁止内层 lambda 意外访问外层接收器。还将展示如何利用多个接收器(如 Row + Column)构建 DSL,并利用 this@ 语法显式指定作用域。你将学会设计一个类似 Compose 的布局 DSL。
@DslMarker
annotation class LayoutMarker
@LayoutMarker
class Row {
fun text(value: String) = println("Row: $value")
}
@LayoutMarker
class Column {
fun text(value: String) = println("Column: $value")
}
fun row(block: Row.() -> Unit) = Row().apply(block)
fun column(block: Column.() -> Unit) = Column().apply(block)
fun main() {
row {
text("outer")
column {
// text("inner") // 编译错误!@DslMarker 禁止访问外层
this@row.text("explicit") // 必须显式指定
}
}
}