有没有一种方法可以使用数据生成Kotlin DSL

时间:2020-06-21 11:36:00

标签: kotlin kotlin-dsl

我们正在使用kotlin dsl作为用户友好的构建器来接受输入并生成数据。有办法做到相反吗? 即,将现有数据转换为dsl吗?

此kotlin表示形式可以转换为dsl吗?

val person = Person("John", 25)
val person = person {
    name = "John"
    age = 25
}

1 个答案:

答案 0 :(得分:2)

除非您真的对{和一些逗号感到疯狂,否则以下是绝对有效的Kotlin代码:

data class Person(
    val name: String,
    val age: Int
)

val person = Person(
    name = "John",
    age = 25
)

我似乎真的很接近您想要的东西,开箱即用。

当然,您可以通过编写一些额外的代码来实现所需的语法,例如:

import kotlin.properties.Delegates

data class Person(
    val name: String,
    val age: Int
)

class PersonDSL{
    lateinit var name: String 
    var age: Int by Delegates.notNull<Int>()

    fun toPerson(): Person = Person(this.name, this.age)
}

fun person(config: PersonDSL.() -> Unit): Person{
    val dsl = PersonDSL()
    
    dsl.config()
    
    return dsl.toPerson()
}

fun main(){
    val person = person {
        name = "John"
        age = 25
    }
    println(person) // Person(name=John, age=25)
}

但是为什么呢?