美文网首页
kotlin DSL语言

kotlin DSL语言

作者: Bfmall | 来源:发表于2022-11-24 16:16 被阅读0次
/**
 * DESC   : DSL语言(Domain Specific Language,即领域特定语言)
 */
const val KtBaseDSLTest01_TAG = "KtBaseDSLTest01"

class DslInfo {
    val info = "dsl语言"
    val name = "dsl"

    fun showDslInfo() {
        Log.d(KtBaseDSLTest01_TAG, "showDslInfo==>info="+info)
    }
}

/**
 * 定义扩展函数apply1
 * apply1函数,就是DSL编程范式,定义输入输出等规则:
 * 1.定义整个lambda规则标准,输入必须是DslInfo这个类,才有资格调用apply1函数,匿名函数里面持有it和this
 * 2.定义整个lambda规则标准,输出 我们会始终返回DslInfo本身,所以你可以链式调用
 * 然后main函数就可以根据DSL编程方式标准规则,来写具体的实现,这就是DSL编程范式。
 */
inline fun DslInfo.apply1(lambda : DslInfo.(String) -> Unit) : DslInfo {
    lambda(info)
    return this
}

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

class KtBaseDSLTest01 {

    fun testDsl01() {
        val dslInfo = DslInfo().apply1 {
            /**
             * this代表当天DslInfo对象,it指的是传递给lambda表达式的参数info
             */
            //testDsl01==>it=dsl语言, this=com.xyaty.kotlinbasedemo.base07.DslInfo@363bfd2
            Log.d(KtBaseDSLTest01_TAG, "testDsl01==>it=$it, this=$this")
            //showDslInfo==>info=dsl语言
            showDslInfo()
            true
        }.apply1 {

        }.apply1 {

        }

    }

    fun testDsl02() {
        val file :File = File("D:\\log.txt").applyFile { fileName, data ->
            Log.d(KtBaseDSLTest01_TAG, "文件名字:"+fileName+", 里面的数据:$data")
            true
        }.applyFile {a, b ->

        }
        .applyFile {a, b ->

        }
        Log.d(KtBaseDSLTest01_TAG, "file本身name="+file.name)
    }
}

相关文章

网友评论

      本文标题:kotlin DSL语言

      本文链接:https://www.haomeiwen.com/subject/ziaazrtx.html