我们正在使用Kotlin DSL作为用户友好的构建器来接收输入并生成数据。是否有一种方法可以做相反的操作?也就是将现有数据转换成DSL格式?
这个Kotlin表示形式能够被转换成DSL吗?
val person = Person("John", 25)
val person = person {
name = "John"
age = 25
}
我们正在使用Kotlin DSL作为用户友好的构建器来接收输入并生成数据。是否有一种方法可以做相反的操作?也就是将现有数据转换成DSL格式?
这个Kotlin表示形式能够被转换成DSL吗?
val person = Person("John", 25)
val person = person {
name = "John"
age = 25
}
除非你对{
和一些逗号真的很痴迷,否则以下是一个绝对有效的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 Sakharewith
,但我决定展示制作 DSL 的原则。我并不是说这是唯一的方法。 - madheadPersonDSL().apply(config).toPerson()
- Animesh Sahu