首页 文章

Kotlin:本地函数是否作为参数内联传递给内联函数?

提问于
浏览
3

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

2 回答

  • 2

    bar()not 声明为内联 . 那你为什么期望它被内联?!

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

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

  • 2

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

    规则是lambdas在传递给内联函数时被内联 . 在所有其他情况下,例如传递函数引用或lambda对象,都不会进行内联 .

相关问题