我希望我的扩展功能有几个接收器。例如我想要功能handle
能够调用两者的方法CoroutineScope
and Iterable
实例:
fun handle() {
// I want to call CoroutineScope.launch() and Iterable.map() functions here
map {
launch { /* ... */ }
}
}
我认为这可能有效:
fun <T> (Iterable<T>, CoroutineScope).handle() {}
但这给了我一个错误:
Function declaration must have a name
我知道我可以使用参数创建函数,但是
单个函数是否可以有多个接收器以及如何在没有参数的情况下做到这一点?
在 Kotlin 版本中1.6.20有一个新功能叫做上下文接收器 https://github.com/Kotlin/KEEP/blob/master/proposals/context-receivers.md。这是上下文接收器的第一个原型。此功能允许通过将上下文接收器添加到其声明中来使函数、属性和类依赖于上下文。有一个新的语法。在函数声明前面,我们可以指定调用该函数所需的上下文类型列表。上下文声明执行以下操作:
- 它要求所有声明的上下文接收器作为隐式接收器出现在调用者的作用域中。
- 它将声明的上下文接收器带入隐式接收器的主体范围。
具有上下文接收器的解决方案如下所示:
context(CoroutineScope)
fun <T> Iterable<T>.handle() {
map {
launch { /* ... */ }
}
}
someCoroutineScope.launch {
val students = listOf(...)
students.handle()
}
In the context(CoroutineScope)
我们可以声明多种类型,例如context(CoroutineScope, LogInterface)
.
由于上下文接收器功能是一个原型,因此要启用它,请添加-Xcontext-receivers
应用程序中的编译器选项build.gradle
file:
apply plugin: 'kotlin-android'
android {
//...
kotlinOptions {
jvmTarget = "11"
freeCompilerArgs += [
"-Xcontext-receivers"
]
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)