Почему невозможно использовать ссылки на методы `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
Android-устройство logcat продолжает работать Как разрушить конструктор в Котлине Котлин – когда выражение с возвращаемым типом функции Миграция с Java 6 на Kotlin gradle не удается скомпилировать классы java с использованием класса kotlin Проверка значений параметров EditText вызывает сбой Восстановить объект в котлине Kotlin и Spring Data JPA создает PropertyReferenceException Нет аргументов типа, ожидаемых для fun findViewById (p0: Int): View Android: Как сделать преобразователи типов (для комнаты) универсальными для всех Список объектов в Котлине Наблюдение за повторным использованием выполнения оператора Как обновить элемент в ArrayList без знания индекса в Android с базой данных Firebase Realtime? Travis CI: Maven не может получить зависимость от Kotlin 1.1.1 от Linux Просмотр не обновляется после первого запуска LiveData при использовании фоновой работы в Android Не удается получить свойство «kotlinOutputDir» на нулевом объекте – Котлин и Спок