2

我希望我的扩展功能有几个接收器。例如,我希望函数handle能够同时调用CoroutineScopeIterable实例的方法:

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

我知道我可以创建带有参数的函数,但是

单个函数是否可以有多个接收器,以及如何在没有参数的情况下做到这一点?

4

2 回答 2

1

这是一个非常狭窄的案例,但是如果您的用例是您有一个更高阶的函数,您希望 lambda 中的代码具有多个接收器,并且如果您想要组合的类型是接口,您可以创建一个类将接口包装为委托。在传递给以下函数的 lambda 中,您可以调用 Iterable 和 CoroutineScope 函数。

class CoroutineScopeAndIterable<T>(
    private val coroutineScope: CoroutineScope,
    private val iterable: Iterable<T>
): CoroutineScope by coroutineScope, Iterable<T> by iterable

suspend fun <T> CoroutineScope.runSomething(
    iterable: Iterable<T>, 
    block: suspend CoroutineScopeAndIterable<T>.() -> Unit
) {
    CoroutineScopeAndIterable(this, iterable).block()
}
于 2022-01-17T17:44:28.770 回答
1

据我所知,这对于我们无法控制的类型目前是不可能的。有计划添加此类功能,它在KEEP-259下处理。

我不知道计划的路线图是什么,也不知道什么时候可以添加,但我希望今年我们至少能看到一些预览。

于 2022-01-17T10:03:59.247 回答