如何在Kotlin中内联扩展函数的接收器参数?
受此启发,我在思考如何内联扩展函数的接收器参数?理论上是这样的:如何在Kotlin中内联扩展函数的接收器参数?,kotlin,inline,extension-function,Kotlin,Inline,Extension Function,受此启发,我在思考如何内联扩展函数的接收器参数?理论上是这样的: inline fun <T> not(crossinline predicate : (T) -> Boolean) = { e : T -> !predicate(e) } 现在,对于上面的代码,我希望编译器抱怨它需要交叉内联;但是,我得到以下警告: 警告:内联公共内联运算符fun((T)->Boolean)的预期性能影响不大。内联最适用于具有函数类型参数的函数 这让我相信编译器没有内联该函数的
inline fun <T> not(crossinline predicate : (T) -> Boolean)
= { e : T -> !predicate(e) }
现在,对于上面的代码,我希望编译器抱怨它需要交叉内联
;但是,我得到以下警告:
警告:内联公共内联运算符fun((T)->Boolean)的预期性能影响不大。内联最适用于具有函数类型参数的函数
这让我相信编译器没有内联该函数的接收器。添加inline
或crossinline
只会产生语法错误
无法内联第二个函数会降低第一个函数的性能
有没有办法告诉编译器内联该接收器参数?这是在中跟踪的,但似乎没有积极处理:(我真的希望这是receiver没有内联的主要原因。起初我只是想回答只有带有lambda参数的函数才是内联的……然而,至少在Java中,这两个函数实际上都变成了隐藏的静态方法,可能看起来是一样的,我也会期待相同的……一个交叉点内联
在第二种情况下也是可能的……但可能这只是Java的情况,在其他语言中不是这样吗?@Roland内联不受Java编译器的支持。如果一个函数被标记为inline
,那么它的lambda参数只有在您使用编译器可以内联的lambda从Kotlin调用时才是内联的。However,receiver参数是一个具有特殊语法和特殊处理的参数,但我不认为编译器不能内联itI的原因我知道…我的意思是扩展函数也会翻译什么…它基本上是一样的…这也是为什么如果实现这两种方法,会出现JVM名称冲突的原因。@Roland你是对的,两者都翻译成public static final kotlin.jvm.functions.Function1而不是(kotlin.jvm.functions.Function1是的……我认为我的英语不如我所希望的好(或者我太累了);-)关于其他语言,例如javascript:我试图在第一条评论中这样说……显然,评论没有到达。:-)
operator inline fun <T> ((T) -> Boolean).not()
= { e : T -> !this(e) }