2017-11-10 1 views
3

私はJobインスタンスのリストを持っています。これは打ち上げ後のある時点で取り消したいものです。これは次のようになります。Kotlinで `suspend`関数へのメソッド参照を使用できないのはなぜですか?

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:サポートされていない[機能を停止する呼び出し可能な参照]"

ない理由この作品?

答えて

5

基本的に、これをサポートするには、言語設計の追加部分が必要であり、単にコルーチンとバンドルされていません。

なぜそれほど簡単なのですか?たとえば、通常の関数の呼び出し可能な参照を取るときなどです。 String::reversedの場合は、KFunction1<String, String>のようになります。 suspend関数で同じことができるのであれば、何を得ると思いますか?

それは同じKFunctionN<...>だ場合は、そこだあなたは、コンパイラが自分のコールを変換suspend機能のみコルーチン内で呼び出すことができますルールを(違反し、通常の機能が期待されている場所の周りにそれを渡すと、それを呼び出すことができます明らかな問題サイト)。

だから、もっと具体的なものでなければなりません。 (私は現在、実際の設計の試行を全く考えずに推測しています)例えば、invoke(...)がサスペンド機能を持つSuspendKFunctionN<...>や、関数を渡すための特別な表記である可能性がありますここではsuspend (T) -> Rが期待されていますが、とにかく、このような機能には、徹底的な設計が将来的に必要となります。

+0

申し訳ありませんが、私はそれを待っています;-) Sergey – s1m0nw1

+0

@ s1m0nw1ありがとうございました。これはいくつか進行中です:https://youtrack.jetbrains.com/issue/KT-21972 – hotkey

関連する問題