Почему невозможно использовать ссылки на методы `suspend` в Kotlin?

У меня есть список экземпляров Job которые я хочу отменить в какой-то момент после запуска. Это выглядит следующим образом:

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

К сожалению, здесь нельзя использовать ссылку на метод. Причина: cancelAndJoin – функция suspend , так как компилятор жалуется:

 jobs.forEach (Job::cancelAndJoin) 

"Ошибка: (30, 24) Kotlin: Неподдерживаемые [Подключенные ссылки для приостановки функций]"

Почему это не работает? (fyi Код выполняется внутри другой сопрограммы)

В принципе, поддержка этого требует дополнительной части дизайна языка и не просто поставляется в комплекте с сопрограммами.

Почему это нетривиально? Потому что, когда вы берете вызываемую ссылку обычной функции, например String::reversed , вы получаете что-то вроде KFunction1<String, String> . Если бы вы могли сделать то же самое с функцией suspend , что бы вы ожидали получить?

Если это тот же KFunctionN<...> , то есть очевидная проблема, что вы можете передать ее туда, где ожидается обычная функция, и вызвать ее, нарушая правило, которое suspend функции, можно вызывать только внутри сопрограмм (где компилятор преобразует их сайты вызовов).

Таким образом, это должно быть нечто более конкретное. (В настоящее время я только размышляю, не подозревая о реальных попытках проектирования) Это может быть, например, SuspendKFunctionN<...> , при этом invoke(...) является приостанавливающей функцией или может (менее вероятно ) – специальная нотация только для передачи ссылки на функцию, где ожидается suspend (T) -> R , но в любом случае такая функция требует тщательного проектирования, чтобы быть надежным в будущем.

Intereting Posts