我想在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)
我的代码出了什么问题?
答案 0 :(得分:4)
您可以在name
上设置Person
个扩展功能,将[{1}}分配给Name
,而不是将其返回:
Person
您甚至可以考虑使用更简洁的语法,例如:
fun Person.name(init: Name.() -> Unit) {
val n = Name()
n.init()
this.name = n
}
我的repository讨论DSL设计并包含示例的无耻插件。
答案 1 :(得分:2)
您需要分配到name
。这最终为我工作......
var p = person {
age = 22
gender = "male"
name = name {
first = "Ali"
last = "Rezaei"
}
}