2017-11-10 99 views
3

我有一個Job實例的列表,我想在啓動後的某個時候取消它。這看起來如下:爲什麼不能在Kotlin中使用方法引用來「暫停」函數?

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

不幸的是,這裏不可能使用方法引用。其原因是:cancelAndJoinsuspend函數,編譯器會抱怨:

jobs.forEach (Job::cancelAndJoin) 

「錯誤:(30,24)科特林:不支持[可調用引用暫停功能]」

爲什麼不這項工作? (代碼在另一個協程中執行)

回答

5

基本上,支持這個需要額外的語言設計部分,而不是簡單地與協程捆綁在一起。

爲什麼它不平凡?因爲當你使用一個普通函數的可調參考時, String::reversed,你會得到類似於KFunction1<String, String>的東西。如果你可以用suspend函數做同樣的事情,你期望得到什麼?

如果是同一KFunctionN<...>,再有就是,你可以通過它周圍,其中一個普通的功能,預計並調用它,違反該suspend功能僅能在協同程序被稱爲規則(如編譯器轉換他們的呼叫一個明顯的問題網站)。

所以,它應該是更具體的東西。 (我目前只是猜測,沒有任何實際設計嘗試的想法)例如,它可能是SuspendKFunctionN<...>,它的invoke(...)是掛起函數,或者它可能(不太可能)是僅用於傳遞函數的特殊符號參考,其中suspend (T) -> R預計,但無論如何,這樣的功能需要徹底的設計,以確保未來。

+0

好吧,我會等待那麼;-)謝謝,謝爾蓋 – s1m0nw1

+0

@ s1m0nw1,有些工作正在進行中:https://youtrack.jetbrains.com/issue/KT-21972 – hotkey

相關問題