1

我正在编写一个示例 DSL 来创建一个基础设施即代码库。基本结构如下:

class Employee internal constructor (private val init: Employee.() -> Unit) {
    var name:String = ""
    var address:String = ""

    infix fun showMessage(msg:String) =
        println("${this.name} resides at ${this.address} and wishes you $msg")

    internal fun describe(){
        init()
        //initialization
    }
}

fun employee(process:Employee.()->Unit) = Employee(process).describe()

fun main(){

    employee {
        name="John Doe"
        address="Amsterdam"
        this showMessage "happy new year"
       // showMessage("This works")
    }

}

我认为 showMessage 中缀函数应该在 Employee 上下文中作为其他中缀工作,但我需要使用this它来使其作为中缀工作。函数调用在没有 this 的上下文中运行良好。这是与 DSL 一起使用时中缀函数的行为还是我错过了什么?

4

1 回答 1

1

这是按设计工作的。来自中缀函数的文档

请注意,中缀函数总是需要指定接收者和参数。当您使用中缀表示法在当前接收器上调用方法时,请显式使用它。这是确保明确解析所必需的。

于 2021-06-22T23:31:31.253 回答