第三十节 DSL中集合

如果要实现这种定义方式呢?(可以有多个地址,类似淘宝的收货地址)

person {
        name = "张三"
        age = 10
        addresses{
            address {
                city = "北京市"
                street = "北三环街道"
                number = 100000
            }
            address {
                city = "北京市"
                street = "北三环街道"
                number = 100000
            }
        }

    }

代码实现:

fun main(args: Array<String>) {


    var p=person {
        name = "张三"
        age = 10
        addresses{
            address {
                city = "北京市"
                street = "北三环街道"
                number = 100000
            }
            address {
                city = "北京市"
                street = "北三环街道"
                number = 100000
            }
        }
    }
    println(p)


}

fun PersonBuilder.addresses(block:ArrayList<Address>.()->Unit)
{
    //需要定义个集合,赋值给personBuilder的addresses
    var list=ArrayList<Address>()
    block.invoke(list)
    this.addresses=list
}

/**
 * 定义address方法
 */
fun ArrayList<Address>.address(block:AddressBuilder.()->Unit)
{
    var addressBuilder=AddressBuilder()
    block.invoke(addressBuilder)
    this.add(Address(addressBuilder.city,addressBuilder.street,addressBuilder.number))
}
/**
 * 首先定义一个方法person,这个返回定义好的Person对象
 */
fun person(block:PersonBuilder.()->Unit):Person
{
    var personBuilder=PersonBuilder()
    block.invoke(personBuilder)
    return Person(personBuilder.name,personBuilder.age,personBuilder.addresses)
}


/**
 * 我们直接定义成data类型,便于打印
 * 城市、街道、街道号
 */
data class Address(val city:String?,val street:String?,val number:Int?)

data class AddressBuilder(var city:String?=null,var street:String?=null,var number:Int?=null)

/**
 * 姓名、年龄、地址
 */
data class Person(val name:String?,val age:Int?,val addresses: ArrayList<Address>?)


data class PersonBuilder(var name:String?=null,var age:Int?=null,var addresses: ArrayList<Address>?=null)



输出:


image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 王鑫是东排村派出所的一名民警,因为新冠病毒的疫情严峻,他连春节都没有休息过一天,他要协助政府做好疫情筛查与居民出行...
    93ff2e3aeee2阅读 184评论 0 0
  • 为了竞争而竞争其实很可怕 从小学到初中 当我还是个耀眼的太阳之时 周围人一直告诉我你很聪明你很厉害你得到什么荣誉都...
    Headabovewater阅读 228评论 0 0
  • 设置行间距为10 设置行高为30 备注 设置了行间距后,文字是单行时也会有一个行间距。所以使用设置行高的方式设置行...
    zooleebee阅读 6,597评论 0 3
  • 狂欢是一个人的孤单,孤单是一群人的狂欢。 只是哪怕周围再多人,感觉还是一个人。 如果被生活为难了,该怎么办? 每一...
    许七安是只喵阅读 281评论 0 0