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是微不足道的。内联最适合具有函数类型参数的函数

这让我相信编译器没有内联该函数的接收器。添加inlineorcrossinline只产生语法错误。

无法内联第二个函数会降低第一个函数的性能。

有没有办法告诉编译器内联该接收器参数?

4

1 回答 1

1

这在https://youtrack.jetbrains.com/issue/KT-5837中进行了跟踪,但似乎并未积极开展工作:(我实际上只是建议支持noinline/crossinline希望这是接收器未内联的主要原因。

于 2019-03-12T21:26:39.307 回答