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()
    }
}
相关推荐
私人珍藏库12 小时前
【Android】聆听岛[特殊字符]聚合全网音乐[特殊字符]免费听歌下载神器[特殊字符] 聚合音乐平台|无损母带下载|歌词封面同步|免费无广告听歌工具
android·人工智能·工具·软件·多功能
YF021113 小时前
Android触摸机制与自定义 View 实战
android·app
Dabei13 小时前
Android TV 焦点处理详解:遥控器与空鼠
android·前端
悠哉清闲14 小时前
裁剪SurfaceView
android
常利兵14 小时前
Android字体字重设置全攻略:XML黑科技+Kotlin动态实现,告别.ttf臃肿
android·xml·科技
therese_1008615 小时前
安卓-IPC
android
沙粒015 小时前
Mac 使用 scrcpy 局域网无线投屏指南
android
过期动态15 小时前
MySQL中的约束
android·java·数据库·spring boot·mysql
牛蛙点点申请出战17 小时前
IconFontViewer -- 一个可以在 Android Studio 中实时预览 IconFont 的插件
android·前端·intellij idea
努力努力再努力wz17 小时前
【MySQL 进阶系列】拒绝滥用root:从 mysql.user 到权限校验,带你彻底理解用户管理与授权机制!
android·c语言·开发语言·数据结构·数据库·c++·mysql