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)
}