kotlin 使用命名良好的函数和 function literals with receiver, 可以实现type-safe builder Type-safe builders allow creating Kotlin-based domain-specific languages (DSLs)
Configuring routes for a web server: Ktor
fun html(init: HTML.() -> Unit): HTML { val html = HTML() html.init() return html }
fun head(init: Head.() -> Unit): Head { val head = Head() head.init() children.add(head) return head }
fun body(init: Body.() -> Unit): Body { val body = Body() body.init() children.add(body) return body }
html { head { … } body { … } }
DSLs需要范围控制, 使用
@DslMarker
kotlin支持
builder type inference
, 对泛型构建很有用
fun addEntryToMap(baseMap: Map<String, Number>, additionalEntry: Pair<String, Int>?) {
val myMap = buildMap {
putAll(baseMap)
if (additionalEntry != null) {
put(additionalEntry.first, additionalEntry.second)
}
}
}
这代码中buildMap 没有明确的类型, 编译器通过
putAll
和put
推断出buildMap 类型.
1.7.0前需要开启builder类型推断-Xenable-builder-inference
, 1.7.0后默认开启
需要接收者的lambda, 目前还不支持泛型接收者 fun
builder应该是类的成员函或者扩展函数.
Supported features:
构建推断是使用
Postponed type variables
工作的, 延迟类型变量是正在进行推断的类型参数的类型. 编译器 使用它来推断.
Contributing to builder inference results: