Kotlin 使用接收器';lambda中的s中缀函数(用于DSL)
我正在使用Kotlin创建一个DSL,我希望利用一个带有中缀函数的receiver对象来获得groovy DSL的感觉。我将从下面的语法示例开始: MyDSL函数{myReceiversInfixFunc“某些字符串”} 我实现这一目标的计划如下:Kotlin 使用接收器';lambda中的s中缀函数(用于DSL),kotlin,Kotlin,我正在使用Kotlin创建一个DSL,我希望利用一个带有中缀函数的receiver对象来获得groovy DSL的感觉。我将从下面的语法示例开始: MyDSL函数{myReceiversInfixFunc“某些字符串”} 我实现这一目标的计划如下: fun myDslFunction(builderFunction: MyReceiverObject.() -> Unit) { val receiver = MyReceiverObject() builderFunctio
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约定来帮助实现这一点,我不会感到惊讶…您无法实现这种语法,因为Kotlin只支持显式指定接收方的
中缀函数调用:此MyReceiveSinfixFunc“someString”
此语法有一个(非常旧的)语言功能请求: