Kotlin的成员扩展函数和implicit receiver

概念

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()
    }
}
相关推荐
流星魂小七9 小时前
颜色选择器
android·着色器·环形颜色选择器·圆形颜色选择器·colorpicker·colorwheelview
cdming9 小时前
LIUNX 与手机安卓的文件互传 的常用方法
android·智能手机
雨白11 小时前
Flow 的异常处理与执行控制
android·kotlin
00后程序员张12 小时前
Web 前端工具全流程指南 从开发到调试的完整生态体系
android·前端·ios·小程序·uni-app·iphone·webview
ClassOps12 小时前
Gradle Groovy 和 Kotlin kts 语法对比
android·kotlin·gradle·groovy
消失的旧时光-194312 小时前
Android ble和经典蓝牙
android
李少兄13 小时前
IntelliJ IDEA 如何全局配置 Maven?避免每次打开新项目重新配置 (适用于 2024~2025 版本)
android·maven·intellij-idea
小蜜蜂嗡嗡14 小时前
【flutter报错:Build failed due to use of deprecated Android v1 embedding.】
android·flutter·embedding
杨筱毅14 小时前
【底层机制】Android GC -- 为什么要有GC?GC的核心原理?理解GC的意义
android·jvm·gc
用户693717500138414 小时前
⚡Kotlin 五大神器完全解析:let、with、run、apply、also 一次搞懂,面试官都笑了!
android·kotlin