¿Por qué es imposible utilizar las references de methods para las funciones `suspender` en Kotlin?

Tengo una list de instancias de Job que quiero cancelar en algún momento después del lanzamiento. Esto se ve de la siguiente manera:

 val jobs = arrayListOf<Job>() //launch and add jobs... jobs.forEach { it.cancelAndJoin() } // cancels the jobs and waits for completion 

Desafortunadamente, no es posible usar una reference de método aquí. El motivo: cancelAndJoin es una function de suspend , ya que el comstackdor se queja:

 jobs.forEach (Job::cancelAndJoin) 

"Error: (30, 24) Kotlin: Unsupported [Referencias invocables para suspender funciones]"

¿Por qué esto no funciona? (fyi El código se ejecuta dentro de otra coroutine)

Básicamente, apoyar esto requiere una porción adicional del layout del lenguaje y no solo viene incluido con corutinas.

¿Por qué no es trivial? Porque cuando tomas una reference invocable de una function ordinaria, por ejemplo, String::reversed , obtienes algo así como una KFunction1<String, String> . Si pudieras hacer lo mismo con una function de suspend , ¿qué esperarías get?

Si es el mismo KFunctionN<...> , entonces hay un problema obvio que puede pasarlo por alto donde se espera una function normal y llamarla, violando la regla de que las funciones de suspend solo se pueden llamar dentro de corutinas (donde el comstackdor transforma sus llamar a los sitios).

Entonces, debería ser algo más específico. (Actualmente solo estoy especulando, sin ninguna idea de bashs de layout reales) Podría ser, por ejemplo, un SuspendKFunctionN<...> , con su invoke(...) siendo una function de suspensión, o podría (less probable ) sea una notación especial solo para pasar una reference de function donde se espera una suspend (T) -> R , pero de todos modos, una característica como esta requiere un layout completo para ser a testing de futuro.

  • ¿Cómo se organizan múltiples corrutines y bloques de expectativas en una testing de Kotlin Spek?
  • Qué significa cerrar un canal de kotlinx.coroutines
  • Kotlin actor a actor comunicación
  • ¿Cómo puedo conectar un productor a un actor?
  • Cómo usar código que se basa en ThreadLocal con corotines de Kotlin
  • ¿Cuál es la forma correcta de usar las extensiones de Anko Coroutines?
  • Kotlin Coroutines en un service de Android
  • Cómo volver a intentar el retroceso exponencial en corotines de kotlin
  • Limpiar el uso de Coroutines en Kotlin con el soporte de testing unitaria
  • Kotlin coroutines unit testing usando mockito
  • cómo implementar una llamada limitada con retrofit que bloquea el cliente y corutinas