
这里写一个
process
方法接受函数作为参数,第二参数为 Int 类型数值参数,然后我们将参数传入给函数,具体如何使用参数交给使用者。
这些要感谢 Venkat Subramaniam 的有关 DSL 的讲座

作为我个人来说,自己看了 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 语言一个好用的特性,就是我们可以不断地为做一些外挂方法,随时扩展某个类让他不断强大。

可以函数作为 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。

网友评论