【Kotlin】DSL

DSL介绍

在这里插入图片描述
在这里插入图片描述

DSL一般用于项目的构建脚本,比如gradle配置文件

使用步骤

使用了高阶函数
扩展函数
带接收者函数的函数参数

DSL简单对象

package com.wzh

fun main() {
    val person2 = person {
        name = "张三"
        age = 20
        address {
            addressName = "广东"
        }
    }
    println(person2)//Person2(name=张三, age=20, address=Address(addressName=广东))
}

fun Person2.address(block: Address.() -> Unit) {
    this.address = Address().apply(block)
    //this.address = Address().also{it.block()}
    /*this.address = Address().let {
        it.block()
        it
    }*/

    /*this.address = with(Address()){
        block()
        this
    }*/

    /*this.address = Address().run {
        block()
        this
    }*/
}

fun person(block: Person2.() -> Unit): Person2 {
    val person2 = Person2()
    person2.block()
    return person2
}

data class Person2(var name: String = "", var age: Int = 0, var address: Address? = null)

data class Address(var addressName: String = "")

DSL使用集合对象

fun main() {
    val p = person {
        name = "张三"
        age = 30
        addresses {
            address {
                addressName = "广东"
            }

            address {
                addressName = "北京市"
            }
        }
    }

    println(p)
}

fun person(b: Person.() -> Unit): Person {
    return Person().apply(b)
}

fun Person.addresses(b: ArrayList<PersonAddress>.() -> Unit) {
    addresses = ArrayList<PersonAddress>().apply(b)
}

fun ArrayList<PersonAddress>.address(b: PersonAddress.() -> Unit) {
    this.add(PersonAddress().apply(b))
}

data class Person(var name: String = "", var age: Int = 0, var addresses: List<PersonAddress>? = null)

data class PersonAddress(var addressName: String = "")

DSL限制变量的作用域

限制作用域,让变量的使用更加安全

定义注解

@DslMarker
annotation class MY

将注解应用到类上

@MY
data class Person(var name: String = "", var age: Int = 0, var addresses: List<PersonAddress>? = null)

@MY
data class PersonAddress(var addressName: String = "")
fun main() {
    val p = person {
        name = "张三"
        age = 30
        addresses {
            address {
                addressName = "广东"
            }

            address {
                addressName = "北京市"
                //name=""//限制作用域后,在这里就无法使用外层的作用域了
            }
        }
    }

    println(p)
}

fun person(b: Person.() -> Unit): Person {
    return Person().apply(b)
}

fun Person.addresses(b: ArrayList<PersonAddress>.() -> Unit) {
    addresses = ArrayList<PersonAddress>().apply(b)
}

fun ArrayList<PersonAddress>.address(b: PersonAddress.() -> Unit) {
    this.add(PersonAddress().apply(b))
}

@MY
data class Person(var name: String = "", var age: Int = 0, var addresses: List<PersonAddress>? = null)

@MY
data class PersonAddress(var addressName: String = "")

@DslMarker
annotation class MY
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值