この質問に触発されて、拡張関数のレシーバーパラメーターをインライン化するにはどうすればよいか考えていました。理論的には、次のようになります。
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 番目の関数をインライン化できないと、最初の関数よりもパフォーマンスが低下します。
そのレシーバーパラメーターをインライン化するようにコンパイラーに指示する方法はありますか?