当将lambda或匿名函数作为参数传递给内联函数时,它非常简单,代码被粘贴到调用位置,但是当将局部函数作为参数传递时,结果似乎不同(显示如下)。我想知道它是否内联?为什么或为什么不呢?
例如:
inline fun foo(arg: () -> Int): Int {
return arg()
}
fun bar(): Int {
return 0
}
fun main(args: Array<String>) {
foo(::bar)
}
反编译的Java代码:
public final class InlinedFuncKt {
public static final int foo(@NotNull Function0 arg) {
Intrinsics.checkParameterIsNotNull(arg, "arg");
return ((Number)arg.invoke()).intValue();
}
public static final int bar() {
return 0;
}
public static final void main(@NotNull String[] args) {
Intrinsics.checkParameterIsNotNull(args, "args");
bar();
}
}
答案 0 :(得分:2)
bar()
不声明为内联。那你为什么期望它被内联?!
换句话说:方法A的签名影响(隐含)另一个方法B的签名是完全错误的。
你的想法会(以某种方式)影响bar()的“语义” - 只是因为你使用bar()
作为另一个方法调用的参数。
答案 1 :(得分:2)
正如decompiled code中所述,kotlin在您的情况下不会内联bar
,但如果它被声明为inline fun bar()
,它会内联它。
规则是lambdas在传递给内联函数时被内联。在所有其他情况下,例如传递函数引用或lambda对象,都不会进行内联。