¿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.

  • Variables "coroutine local" en kotlin
  • Spring 5 and Kotlin 1.1 Coroutines: Type rx.Scheduler no presente
  • Kotlin coroutines en Android: ¿Por qué usar bg () de Anko en lugar de async ()?
  • Unidad probando una corotina de Kotlin con retraso
  • ¿Pueden `SendChannel.offer`,` CompletableDefernetworking.complete` y similares llamarse corutinas externas?
  • ¿Cómo puedo conectar un productor a un actor?
  • Cómo usar código que se basa en ThreadLocal con corotines de Kotlin
  • reference no resuelta: lanzamiento
  • Kotlin coroutine no espera a ser hecho
  • Kotlin coroutines usa produce y mockito para burlarse del trabajo de producción
  • Oyente dentro del productor