我想在 Kotlin 中有以下人员对象:
var p = person {
age = 22
gender = "male"
name {
first = "Ali"
last = "Rezaei"
}
}
我有以下代码来构建它:
data class Person(var age: Int? = null, var gender: String? = null
, var name : Name? = null) {
}
fun name(init: Name.() -> Unit): Name {
val n = Name()
n.init()
return n
}
data class Name(var first: String? = null, var last : String? = null)
fun person(init: Person.() -> Unit): Person {
val p = Person()
p.init()
return p
}
但是当我打印它时,结果如下:
Person(age=22, gender="male", name=null)
我的代码有什么问题?
您可以在Person
上name
创建一个扩展函数,将Name
分配给Person
而不是返回它:
fun Person.name(init: Name.() -> Unit) {
val n = Name()
n.init()
this.name = n
}
您甚至可以考虑使用更简洁的语法,如下所示:
fun Person.name(init: Name.() -> Unit) {
this.name = Name().apply(init)
}
我的存储库讨论DSL设计和包含示例的无耻插件。
您需要
分配给name
。 这最终对我有用...
var p = person {
age = 22
gender = "male"
name = name {
first = "Ali"
last = "Rezaei"
}
}