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()
    }
}
相关推荐
2501_915918411 小时前
uni-app 项目 iOS 上架踩坑经验总结 从证书到审核的避坑指南
android·ios·小程序·https·uni-app·iphone·webview
游戏开发爱好者81 小时前
iOS 上架 uni-app 流程全解析,从打包到发布的完整实践
android·ios·小程序·https·uni-app·iphone·webview
雨白5 小时前
实现双向滑动的 ScalableImageView(上)
android
Y4090016 小时前
数据库基础知识——聚合函数、分组查询
android·数据库
没有了遇见11 小时前
Android 原生定位(替代高德 / 百度等三方定位)<终极版本>
android
2501_9160088912 小时前
iOS 抓包工具有哪些?全面盘点主流工具与功能对比分析
android·ios·小程序·https·uni-app·iphone·webview
2501_9159214312 小时前
iOS混淆工具实战 视频流媒体类 App 的版权与播放安全保护
android·ios·小程序·https·uni-app·iphone·webview
CYRUS_STUDIO12 小时前
LLVM 全面解析:NDK 为什么离不开它?如何亲手编译调试 clang
android·编译器·llvm
CYRUS_STUDIO12 小时前
静态分析神器 + 动态调试利器:IDA Pro × Frida 混合调试实战
android·逆向
g_i_a_o_giao15 小时前
Android8 binder源码学习分析笔记(一)
android·java·笔记·学习·binder·安卓源码分析