Kotlin:局部函数是否作为内联参数传递给内联函数?

Kotlin: Is local function passed to inlined functions as parameter inlined?

将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();
   }
}

bar() 声明为 内联。那你为什么期望它是内联的?!

换句话说:方法 A 的签名影响(隐含地)另一个方法 B 的签名是完全错误的。

您的想法会(以某种方式)影响 bar() 的 "semantics" - 只是因为您使用 bar() 作为另一个方法调用的参数。

正如您在 decompiled code 中所做的那样,kotlin 在您的情况下不会内联 bar,但如果声明为 inline fun bar().

,它会内联它

规则是 lambda 在传递给内联函数时是内联的。在所有其他情况下,如传递函数引用或 lambda 对象,不进行内联。