如何在自定义Kotlin DSL上使用使用规则

问题描述 投票:0回答:1

我正在按照以下示例调查Kotlin DSL:-

https://github.com/zsmb13/VillageDSL

我对如何在DSL公开的所有属性上强制使用规则感兴趣。

以下面的示例:-

val v = village {
    house {
        person {
            name = "Emily"
            age = 31
        }
         person {
            name = "Jane"
            age = 19
        }
    }
}

我想执行一个规则,使DSL用户无法输入重复的属性,如下所示

val v = village {
    house {
        person {
            name = "Emily"
            name = "Elizabeth"
            age = 31
        }
         person {
            name = "Jane"
            age = 19
            age = 56
        }
    }
}

例如,我曾尝试过Kotlin合同

contract { callsInPlace(block, EXACTLY_ONCE) }

但是这些仅在顶级功能中允许,例如,当在DSL中使用遵循Builder模式时,我看不到如何使用合同。>

@SimpleDsl1
class PersonBuilder(initialName: String, initialAge: Int) {
    var name: String = initialName
    var age: Int = initialAge

    fun build(): Person {
        return Person(name, age)
    }
}

是否可以达到我期望的效果,即每人仅强制设置一个属性?

我正在按照以下示例研究Kotlin DSL:-https://github.com/zsmb13/VillageDSL我对如何对DSL公开的所有属性实施使用规则感兴趣。以...

kotlin dsl
1个回答
0
投票

我认为,如果您要查找的是编译错误,那么您也不会收到IDE警告或错误。归根结底,Kotlin的DSL实际上仍然是不同语法糖元素的组合。

© www.soinside.com 2019 - 2024. All rights reserved.