有没有可能让函数" Select 性地挂起"?为了用一个例子进行说明,让我们以这个函数为例,该函数包装了一个回调并在前后记录:
fun withLogs(cb: () -> Unit) {
println("Before");
cb();
println("After");
}
现在,我可以使用普通函数调用此函数,但不能使用挂起函数:
fun unsuspend () {
withLogs({ println("my func") }); // this is fine
}
suspend fun suspended() {
withLogs(suspend { println("my func") }); // this is not
}
现在我可以为此创建一个显式重载,但它将完全相同,除了几个Suspend关键字:
fun withLogs(cb: () -> Unit) {
println("Before");
cb();
println("After");
}
suspend fun withLogs(cb: suspend () -> Unit) {
println("Before");
cb();
println("After");
}
是否可以编写函数,使其复制CB的挂起状态?例如,这个 idea :
<S: suspend> fun withLogs(S cb: () -> Unit) { /* snip */ }
fun unsuspend () {
withLogs({ println("my func") }); // suspended
}
suspend fun suspended() {
withLogs(suspend { println("my func") }); // unsuspended
}
到目前为止,我发现的最好的解决方法是使用runBlocking
将未挂起的版本委托给挂起的版本:
fun withLogs(cb: () -> Unit) = runBlocking(withLogs(suspend { cb() }))
但希望有更优雅的东西