/**
* 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)
}
}
网友评论