Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Kotlin中内联扩展函数的接收器参数?_Kotlin_Inline_Extension Function - Fatal编程技术网

如何在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) }