概念
implicit receiver: 隐式的接收器或者接收者,接受函数的调用和属性的访问。
在java中这个隐式的接收者其实就是this。而kotlin对它进行了一些关键性的拓展,在拓展的同时,为了方便描述和沟通,给它起了专属的名字:implicit receiver。
比如在Java中,可以隐式的调用内部类和外部类的成员变量,kotlin同理。
kotlin特殊的点在于,他可以直接通过函数来嵌套新的this。
例如kotlin协程的CoroutineScope就利用了这种概念,可以理解成提供了一个CoroutineScope的环境。
成员扩展函数
现在定义这样一个类IntMultiplier,它的内部有个成员变量,同时这个成员变量又是Int的扩展函数
kotlin
class IntMultiplier(val time: Int = 2) {
fun Int.multiply() = this * time
}
我们是无法直接调用它的。所以我们要想办法创造一个IntMultiplier的环境,才能去使用这个扩展函数。
这里写了一个runAsOuter的函数,传进去一个函数类型的参数block,又设置block的receiver类型是IntMultiplier,这样就强行插入了一个IntMultiplier的this。
kotlin
class IntMultiplier(val time: Int = 2) {
fun Int.multiply() = this * time
fun runAsOuter(block: IntMultiplier.() -> Unit) {
block()
}
}
这样就可以通过这个函数来进行调用了。
kotlin
fun main() {
val multiplier = IntMultiplier()
multiplier.runAsOuter {
3.multiply()
}
}