在lambda中使用接收器的中缀函数(用于DSL)

时间:2017-08-30 16:26:20

标签: kotlin

我正在使用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大会以协助这样做,我不会感到惊讶......

1 个答案:

答案 0 :(得分:1)

您无法实现此语法,因为Kotlin仅支持明确指定接收器的infix函数调用:this myReceiversInfixFunc "someString"

这种语法有一个(相当古老的)语言功能请求:KT-1292