Kotlin之DSL的学习


引入

当我们在适用函数参数的时候,并且调用,是这样写的:

1
2
3
fun notNullFun(block: () -> Unit) {
block()
}

其实还有一种写法,那就是调用invoke方法:

1
2
3
fun notNullFun(block: () -> Unit) {
block.invoke()
}

在这里看不出有啥区别,但是如果我们在使用一个可空类型的属性时:

1
2
3
4
5
val nullVal: (() -> Unit)? = null
fun nullFun() {
nullVal?.let { it() }
}

invoke就能很简单:

1
2
3
4
5
val nullVal: (() -> Unit)? = null
fun nullFun() {
nullVal?.invoke()
}

好,当我们如果要用一个对象的实例来当成函数一样使用的话那么该怎么做了?
这就跟上面说的的invoke有关了,通过使用operator关键字,来修饰invoke方法,那么这个对象的实例就能够被当成函数一样调用了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
data class Person(val name: String, val age: Int) {
// operator
operator fun invoke(block: (Person) -> Unit) {
block(this)
}
}
fun main(args: Array<String>) {
val person = Person("Jowan", 25)
person {
println(it.toString())
}
}
// 打印 Person(name=Jowan, age=25)

这,就是我们最简单的DSL了。

下面进入正题。

正文