4

この質問に触発されて、拡張関数のレシーバーパラメーターをインライン化するにはどうすればよいか考えていました。理論的には、次のようになります。

inline fun <T> not(crossinline predicate : (T) -> Boolean)
    = { e : T -> !predicate(e) }

それpredicateがレシーバー関数になります。

operator inline fun <T> ((T) -> Boolean).not()
    = { e : T -> !this(e) }

crossinlineさて、上記のコードでは、コンパイラが;が必要だと不平を言うと思います。ただし、次の警告が表示されます。

警告: インライン化による予想されるパフォーマンスへの影響public inline operator fun <T> ((T) -> Boolean).not(): (T) -> Booleanはわずかです。インライン化は、関数型のパラメーターを持つ関数に最適です

これは、コンパイラがその関数のレシーバーをインライン化していないと私に信じさせます。inlineまたはのみを追加するとcrossinline、構文エラーが発生します。

2 番目の関数をインライン化できないと、最初の関数よりもパフォーマンスが低下します。

そのレシーバーパラメーターをインライン化するようにコンパイラーに指示する方法はありますか?

4

1 に答える 1

1

これはhttps://youtrack.jetbrains.com/issue/KT-5837で追跡されていますが、積極的に取り組んでいるようには見えません:(実際にサポートを提案しましたnoinline/crossinlineそれがレシーバーがインライン化されていない主な理由であることを願っています.

于 2019-03-12T21:26:39.307 に答える