我正在使用Kotlin创建DSL,我希望利用具有中缀功能的接收器对象来获得那种时髦的DSL感觉。我将从我所遵循的语法示例开始:
myDslFunction {myReceiversInfixFunc" some string" }
我实现这一目标的计划是这段代码:
fun myDslFunction(builderFunction: MyReceiverObject.() -> Unit) {
val receiver = MyReceiverObject()
builderFunction(receiver)
// do something with receiver
}
class MyReceiverObject {
infix fun myReceiversInfixFunc(someString: String) {
// do something with someString
}
}
上面的函数和类片段编译得很好,但上面列出的DSL语法并不适用。以下是我为测试编译而编写的一些测试函数:
fun test() {
// desired syntax
myDslFunction {
myReceiversInfixFunc "some string" // doesn't compile
}
// not-desired syntax that compiles and works...
myDslFunction {
this myReceiversInfixFunc "some string" // does compile
}
}
这里的关键区别是添加了this
关键字来设置中缀表示法,但我认为这是不受欢迎的,并且无法使用接收器对象。
我有什么明显的遗失吗?我可以实现我想要的语法吗?如果我忽视Kotlin大会以协助这样做,我不会感到惊讶......
答案 0 :(得分:1)
您无法实现此语法,因为Kotlin仅支持明确指定接收器的infix
函数调用:this myReceiversInfixFunc "someString"
。
这种语法有一个(相当古老的)语言功能请求:KT-1292。