kotlin 基础 22 DSL(领域特定语言)

作者: zidea | 来源:发表于2019-04-06 16:14 被阅读26次
kotlin.jpeg
这里写一个process方法接受函数作为参数,第二参数为 Int 类型数值参数,然后我们将参数传入给函数,具体如何使用参数交给使用者。

这些要感谢 Venkat Subramaniam 的有关 DSL 的讲座


venkat.jpg

作为我个人来说,自己看了 Venkat Subramaniam 的 presentation, 感觉将很清楚而且有深度。个人觉得受益匪浅所以在这里表示感谢。

fun process(func:(n:Int) -> Unit, n:Int){
    func(n * 2)
}

如果 js 的 developer 这段代码应该再熟悉不过了,这样代码充满 javascript 的应用中。

 process({ e -> println(e)}, 3)

在 kotlin 如果函数作为参数,也就是闭包作为最后参数传入。

fun process(n:Int,func:(n:Int) -> Unit){
    func(n * 2)
}
process(3,{ e -> println(e)})

当闭包作为第最后参数传入,我们在调用函数时可以这些来写,这样更接近 DSL 语言。

process(3) { e -> println(e) }

创建 call 函数,接受函数作为参数,在 call 函数内部调用这个函数传入其所需参数。

fun call(greet:(String)-> Unit){
    greet("Jane")
}
    call {
        name -> println("$name")
    }

kotlin 语言一个好用的特性,就是我们可以不断地为做一些外挂方法,随时扩展某个类让他不断强大。

big_IronManHulkbuster.jpg

可以函数作为 String 扩展,也就是给传入函数一个上下文,上下文概念在 DSL 语言中

fun call(greet: String.(String)-> Unit){
    greet("hello","jane")
}
    call {
        name -> println("${this.toUpperCase()} $name")
    }

这里 this 被绑定到 "hello" 这个字符串对象上,所以输出为

HELLO Jane

在 kotlin 中给了我们更多的选择,也可以这样写"hello".greet("jane")这种形式。

fun call(greet: String.(String)-> Unit){
//    greet("hello","jane")
    "Hello".greet("jane")
}

kotlin 给我们两种选择来传入 greet 方法的上下文

  • 作为参数greet("hello","jane")传入 context
  • 作为一个对象"Hello".greet("jane")传入,然后调用对象的 greet 方法的形式
 call {
   println("${this.toUpperCase()} $name")
}

在开始谈论 DSL 时候我们反复强调了 context,这回 kotlin 从语法层面上提供 context。

Learn-a-Programming-Language-Step-24.jpg

相关文章

网友评论

    本文标题:kotlin 基础 22 DSL(领域特定语言)

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