类型安全生成器示例kotlin
我希望在Kotlin中有以下person对象:类型安全生成器示例kotlin,kotlin,Kotlin,我希望在Kotlin中有以下person对象: var p = person { age = 22 gender = "male" name { first = "Ali" last = "Rezaei" } } 我有以下代码来构建它: data class Person(var age: Int? = n
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)
我的代码有什么问题?您需要分配给
name
。这最终对我有用
var p = person {
age = 22
gender = "male"
name = name {
first = "Ali"
last = "Rezaei"
}
}
您需要分配给
名称
。这最终对我有用
var p = person {
age = 22
gender = "male"
name = name {
first = "Ali"
last = "Rezaei"
}
}
您可以在
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设计并包含示例的无耻插件。您可以在
Person
上创建一个扩展函数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设计并包含示例的无耻插件