Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
类型安全生成器示例kotlin_Kotlin - Fatal编程技术网

类型安全生成器示例kotlin

类型安全生成器示例kotlin,kotlin,Kotlin,我希望在Kotlin中有以下person对象: var p = person { age = 22 gender = "male" name { first = "Ali" last = "Rezaei" } } 我有以下代码来构建它: data class Person(var age: Int? = n

我希望在Kotlin中有以下person对象:

       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设计并包含示例的无耻插件