有没有一种使用数据生成 Kotlin DSL 的方法?

4

我们正在使用Kotlin DSL作为用户友好的构建器来接收输入并生成数据。是否有一种方法可以做相反的操作?也就是将现有数据转换成DSL格式?

这个Kotlin表示形式能够被转换成DSL吗?

val person = Person("John", 25)

val person = person {
    name = "John"
    age = 25
}

2
你到底想做什么?是将第一个片段转换为第二个吗? - Govinda Sakhare
你可以轻松地制作一个与Kotlin代码交互的Android Studio插件,使用PSI即可。 - user
@GovindaSakhare 是的,确切地说,我正在尝试将现有对象转换为DSL表示形式。 - sdb
@user 请详细说明。 - sdb
请参阅此链接以创建插件。您可以使用编辑器事件将Kotlin代码转换为DSL形式。 - user
1个回答

4

除非你对{和一些逗号真的很痴迷,否则以下是一个绝对有效的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)
}

但是为什么要这样做?


这里使用 with(person) 不是更好的选择吗? - Govinda Sakhare
也许你可以使用 with,但我决定展示制作 DSL 的原则。我并不是说这是唯一的方法。 - madhead
@madhead 我正在尝试为现有数据生成DSL。 - sdb
1
在一行中 PersonDSL().apply(config).toPerson() - Animesh Sahu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接