0
点赞
收藏
分享

微信扫一扫

Kotlin中DSL领域专用语言理解(Domain Specified Language/DSL)

_铁马冰河_ 2022-02-09 阅读 86
class Context {
    val info = "yuknight"
    val name = "AAA"

    fun toast(str: String) = println("toast:$str")
}

inline fun Context.myApply(lambda: Context.(String) -> Unit): Context {
    lambda(info)
    return this
}

inline fun File.applyFile(action: (String, String) -> Unit): File {
    setWritable(true)
    setReadable(true)
    action(this.name, this.readLines()[0])
    return this
}

fun main() {
    //其实myApply函数就是DSL编程范式,定义输入输出等规则
    //1.定义整个lambda规则标准,输入 必须是Context这个类,才能调用myApply函数,匿名函数里持有it和this
    //2.定义整个lambda规则标准,输出 始终返回Context本身,所以可以链式调用
    //然后main函数就可以根据DSL编程方式标准规则来写具体的实现,这就是DSL编程范式
    val context = Context().myApply {
        //it == String == "yuknight"
        println("我的it:$it, this:$this")
        toast("abcdefghijklmn")
        toast(it)
        toast(name)//this.name
        true
    }.myApply { }.myApply { }
    println("始终输出的是:" + context.name)
    println()

    //其实applyFile函数,就是DSL编程范式,定义输入输出等规则
    //1.定义整个lambda规则标准,输入 File,其实applyFile函数,匿名函数里持有fileName和data
    //2.定义整个lambda规则标准,输出 File,所以可以链式调用
    val file: File = File("D:\\a.txt")
        .applyFile { fileName, data ->
            println("文件名:$fileName, 内容是:$data")
            true//最后一行不影响返回值
        }.applyFile { a, b -> }.applyFile { a, b -> }
    println("始终输出File本身:"+ file.name)
}
举报

相关推荐

0 条评论