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()
    }
}
相关推荐
原神启动120 分钟前
Ansible(三)—— 使用Ansible自动化部署LNMP环境
android·自动化·ansible
前端老白33 分钟前
webview在微信小程序中,安卓加载失败,IOS正常加载
android·ios·微信小程序·webview
2501_9371549333 分钟前
适配中兴主流机型 纯净版刷机固件技术优势合集
android·源码·源代码管理·机顶盒
2501_9151063235 分钟前
用 HBuilder 上架 iOS 应用时如何管理Bundle ID、证书与描述文件
android·ios·小程序·https·uni-app·iphone·webview
TheNextByte143 分钟前
如何通过OTG或不使用OTG将文件从Android传到U盘
android
2501_9159090644 分钟前
资源文件混淆在 iOS 应用安全中的实际价值
android·安全·ios·小程序·uni-app·iphone·webview
2501_9159184144 分钟前
iOS App 性能测试中常被忽略的运行期问题
android·ios·小程序·https·uni-app·iphone·webview
天勤量化大唯粉1 小时前
基于距离的配对交易策略:捕捉价差异常偏离的均值回归机会(天勤量化代码实现)
android·开发语言·python·算法·kotlin·开源软件·策略模式
走在路上的菜鸟1 小时前
Android学Dart学习笔记第二十二节 类-扩展方法
android·笔记·学习·flutter
csj501 小时前
安卓基础之《(7)—中级控件(1)图形定制》
android