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 对象,不进行内联。
将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 对象,不进行内联。